总计结果,只有条件为真才能总和

我试图得到$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 ] } 

其中余额是匹配查询中所有收入字段的总和,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 } }); 

注意: $match使用的createdAt值由插件自动插入。

$cond操作符本质上应该是$sum操作符的expression式,如下所示:

 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);