node.js - Mongoose 模型#聚合函数返回 0
问题描述
我有以下对象:
用户
事件
票
购票
我正在尝试根据特定的给定来计算给定的Tickets
总数。TicketPurchases
Event
Ticket.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,但是,我可以确认 TicketPurchase 中有门票。
此外,这篇文章建议避免使用 $unwind。
我还是 mongodb 的新手。提前致谢
工具:
节点
猫鼬
实验室
解决方案
您错过了$lookup
允许您将购票收集与门票收集结合起来的阶段。
{"$lookup":{
"from":"ticket",
"localField":"tickets",
"foreignField":"_id",
"as":"tickets"
}}
另一种更高效的解决方案是使用$lookup
++$unwind
组合$match
将类型标准应用于连接的集合,而不是$group
with $filter
。用以下阶段替换所有$match
阶段。
就像是
{"$lookup":{
"from":"ticket",
"localField":"tickets",
"foreignField":"_id",
"as":"tickets"
}},
{"$unwind":"$tickets"},
{"$match":{"tickets.type":results.type}},
{"$count":"count"}
推荐阅读
- jquery - 在多个变量中使用 html 标签拆分变量
- python - 我可以根据字典中的出生年份计算年龄值吗?
- project-reactor - 如何并行处理 Flux 事件?
- docker - Docker 和 RUN sed 字符串转义
- java - 如何使按钮对用户独占?
- r - 寻找全局最小值
- csv - 尝试使用 tensorflow 数据集为 keras 模型准备 CSV
- node.js - 如何在 Google Cloud Storage 中使用 bucket.upload() 而不是 file.createWriteStream()?
- python - 覆盖子类中的属性设置器抽象方法
- java - 使用 Java 从方法中转换为货币