我正在尝试获取 $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 ] }
其中余额是匹配查询中所有收入字段的总和,计数是用户对数据贡献的计数。
如果我无条件地对计数求和(例如像这样),效果很好
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 }
});
注意:$match
中使用的 createdAt
值由插件自动插入。
最佳答案
$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);
关于node.js - 聚合结果,仅当条件为真时求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397082/