首页 > 解决方案 > Mongoose 模型#聚合函数返回 0

问题描述

我有以下对象:

我正在尝试根据特定的给定来计算给定的Tickets总数。TicketPurchasesEventTicket.type

我正在使用以下代码来尝试实现这一目标:

票务.js

const TicketSchema = new Schema({
    type : {type: String},
    total_quantity : {type: Number},
    price : {type: String},
    limit_per_order: {type: Number},
    start_date: {type: Date},
    end_date: {type: Date},
    description: {type: String},
    validated: {type: String, default: 'false'}
});

ticketPurchase.js

const TicketPurchaseSchema = new Schema({
    user: {type: Schema.Types.ObjectId, ref: 'User'},
    event: {type: Schema.Types.ObjectId, ref: 'Event'},
    tickets: [{type: Schema.Types.ObjectId, ref: 'Ticket'}],
    time_stamp: {type: Date}

});

计数.js

var event_id = req.query.event_id;
var ticket_id = req.query.ticket_id;

Ticket.findOne({ _id: ticket_id }).exec(function(err, results) {
  if (err) {
    console.log(err);
  }
  console.log(results); //returns ticket successfully
  TicketPurchase.aggregate(
    [
      {
        $match: {
          event: mongoose.Types.ObjectId(event_id)
        }
      },
      {
        $group: {
          _id: null,
          count: {
            $sum: {
              $size: {
                $filter: {
                  input: "$tickets",
                  as: "el",
                  cond: {
                    $eq: ["$$el.type", results.type]
                  }
                }
              }
            }
          }
        }
      }
    ],

    function(err, results) {
      if (err) {
        console.log(err);
      } else {
        console.log(results); //number of ticket purchases
      }
    }
  );
});

但我不断得到以下结果:

计数始终为 0

计数始终为 0,但是,我可以确认 TicketPurchase 中有门票。

米拉德

此外,这篇文章建议避免使用 $unwind。

我还是 mongodb 的新手。提前致谢

工具:

标签: node.jsmongodbmongooseaggregation-framework

解决方案


您错过了$lookup允许您将购票收集与门票收集结合起来的阶段。

$match在和之间添加以下阶段$group

{"$lookup":{
  "from":"ticket",
  "localField":"tickets",
  "foreignField":"_id",
  "as":"tickets"
}}

另一种更高效的解决方案是使用$lookup++$unwind组合$match将类型标准应用于连接的集合,而不是$groupwith $filter。用以下阶段替换所有$match阶段。

就像是

{"$lookup":{
    "from":"ticket",
    "localField":"tickets",
    "foreignField":"_id",
    "as":"tickets"
}},
{"$unwind":"$tickets"},
{"$match":{"tickets.type":results.type}},
{"$count":"count"}

推荐阅读