Mongoose Model#Aggregate函数返回0
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongoose Model#Aggregate函数返回0相关的知识,希望对你有一定的参考价值。
我有以下对象:
- 用户
- 事件
- 票
- TicketPurchase
我试图根据特定的Tickets
计算所有TicketPurchases
中Event
的数量给定的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总是0,但是,我可以确认TicketPurchase中有Tickets。
此外,this post建议避免使用$ unwind。
我还是mongodb的新手。提前致谢
工具:
- 的NodeJS
- 猫鼬
- MLAB
答案
您错过了$lookup
阶段,该阶段允许您通过门票收集加入门票购买集合。
"$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.aggregate(pipeline) 使用 $unwind、$lookup、$group 链接多个集合