我试图得到$revenue
的所有值的总和,以及$user
等于我传递的用户参数的计数调用这个功能。
this.aggregate([
{ $match: { createdAt: { $gte: start, $lte: end }, 'status.verified': true } },
{
$group: {
_id: null,
balance: {
$sum: "$revenue"
},
count: {
$cond: {
if: { $eq: [ "$user", user ] },
then: { $sum: 1 },
else: { $sum: 0 }
}
}
}
}
], next);
我希望数据看起来像这样:
[ { _id: null, balance: 1287, count: 10 ] }
其中balance是匹配查询中所有收入字段的总和,count是该用户对数据的贡献计数。
如果我无条件地计算数量(例如像这样)
,它的工作正常this.aggregate([
{ $match: { createdAt: { $gte: start, $lte: end }, 'status.verified': true } },
{
$group: {
_id: null,
balance: {
$sum: "$revenue"
},
count: { $sum: 1 }
}
}
], next);
这表明错误与我的条件总和有关。 MongoDB抛出的错误是
TypeError: Cannot read property '0' of undefined
at redacted:10:20
at redacted/node_modules/mongoose/lib/aggregate.js:529:13
我的架构是
var schema = new Schema({
user: { type: Schema.Types.ObjectId, ref: 'User' },
status: {
verified: { type: Boolean, default: false },
completed: { type: Boolean, default: false },
canceled: { type: Boolean, default: false },
refused: { type: Boolean, default: false }
},
meta: { type: Schema.Types.Mixed, default: {} },
revenue: { type: Number, default: 0 }
});
注意:createdAt
中使用的$match
值会被插件自动插入。
答案 0 :(得分:0)
$cond
运算符应该基本上是 $sum
运算符的表达式,如下所示:
this.aggregate([
{ "$match": {
"createdAt": { "$gte": start, "$lte": end },
"status.verified": true
} },
{
"$group": {
"_id": null,
"balance": { "$sum": "$revenue" },
"count": {
"$sum": {
"$cond": [
{ "$eq": [ "$user", user ] },
1, 0
]
}
}
}
}
], next);