MongoDB聚合算术操作 – 子文档字段

我们有一个聚合查询投影几个子文件。 我们想要对这些投影值应用Sum和Product等算术运算。

聚合查询 –

Item.aggregate([ { $unwind: '$dummy'}, { $match: {'dummy.storage': {$gt: 0}} }, { $group: {_id: '$_id', dummy: {$push: '$dummy'}, original_y: { $first: "$original_y" }, new_y: { $first: "$new_y" }, }}, {$project:{ original_y: 1, new_y: 1, tallyAmount: {$sum: ["$new_y","$original_y"] } } }, ] ) .exec(function(err, results){ if(err) { console.log("Error : " + err); return res.json ({error: "Error"}); } else if(!(results) || results == null || results.length == 0) { console.log("No Results Found"); return res.json ({error: "No Results Today"}); }else{ res.send(results); } }); 

这给出了一个错误,说明invalid operator '$sum'

我们应该做些什么来获得$projectoriginal_ynew_y的总和?

编辑

文件:

 { id:1, original_y: 200, new_y: 140, dummy: [ {id:1, storage:2, cost: 10}, {id:2, storage:0, cost: 20}, {id:3, storage:5, cost: 30}, ] } 

产量预期:

  { id:1, original_y: 200, new_y: 140, dummy: [ {id:1, storage:2, cost: 10, tallyAmount: 34}, {id:3, storage:5, cost: 30, tallyAmount: 11.33}, ] } 

其中, tallyAmount = (original_y + new_y) / cost

错误:由于已经有一个适用于整个字段的expression式,因此无法为虚拟子字段添加expression式

没有太多的文档模式和预期的聚合结果的细节,我build议你尝试下面的聚合,因为我相信你需要$add运算符而不是$sum运算符。 请注意, $sum运算符仅适用于$group运算符。 使用$add操作符,它将两个数字/字段组合在一起,并使用$project操作符将结果存储在新字段中:

 Item.aggregate([ { "$match": { "dummy.storage": { "$gt": 0 } } }, { "$unwind": "$dummy" }, { "$group": { "_id": "$_id", "original_y": { "$first": "$original_y" }, "new_y": { "$first": "$new_y" } } }, { "$project": { "original_y": 1, "new_y": 1, "tallyAmount": { "$add": [ "$new_y", "$original_y" ] } } } ]).exec(callback); 

更新

为了满足条件tallyAmount = (original_y + new_y) / cost ,你应该在你的$ project operator pipeline阶段使用$add$divide算术运算符,因此你的最终的聚合pipe道看起来像这样:

 Item.aggregate([ { "$match": { "dummy.storage": { "$gt": 0 } } }, { "$unwind": "$dummy" }, { "$project": { "original_y": 1, "new_y": 1, "dummy.id": "$dummy.id", "dummy.storage": "$dummy.storage", "dummy.cost": "$dummy.cost", "dummy.tallyAmount": { "$divide": [ { "$add": ["$new_y","$original_y"] }, "$dummy.cost" ] } } }, { "$group": { "_id": "_$id", "original_y": { "$first": "$original_y" }, "new_y": { "$first": "$new_y" }, "dummy": { "$addToSet": "$dummy" } } } ]).exec(callback);