Mongoose Model#Aggregate函数返回0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongoose Model#Aggregate函数返回0相关的知识,希望对你有一定的参考价值。

我有以下对象:

  • 用户
  • 事件
  • TicketPurchase

我试图根据特定的Tickets计算所有TicketPurchasesEvent的数量给定的Ticket.type

我使用以下代码来尝试实现此目的:

ticket.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

);

count.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
                        

                    
        );

);

但我一直得到以下结果:

count is always 0

Count总是0,但是,我可以确认TicketPurchase中有Tickets。

mLad

此外,this post建议避免使用$ unwind。

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

工具:

  • 的NodeJS
  • 猫鼬
  • MLAB
答案

您错过了$lookup阶段,该阶段允许您通过门票收集加入门票购买集合。

$match$group之间添加以下阶段。

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

替代和更多performant解决方案将使用$lookup + $unwind + $match组合将类型标准应用于联合集合而不是$group$filter。在$match之后用以下阶段替换所有阶段。

就像是

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

以上是关于Mongoose Model#Aggregate函数返回0的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoose-aggregate-paginate-v2 中排序

按 mongoose-aggregate-paginate-v2 更改顺序排序

mongoose 文档 queries

Mongoose.aggregate(pipeline) 使用 $unwind、$lookup、$group 链接多个集合

Mongoose,在子文档数组上应用`.aggregate()`,并以最少的查询次数获得文档其他字段的结果

Mongoose/Mongodb Aggregate - 对多个字段进行分组和平均