Node.js – 如何计算在MongoDB中的子文件的总和(总和)?

我的collections结构是,

[{ "_id": "....", "name": "aaaa", "level_max_leaves": [{ level: "ObjectIdString 1", max_leaves: 4, }] }, { "_id": "....", "name": "bbbb", "level_max_leaves": [{ level: "ObjectIdString 1", max_leaves: 4, }] }, { "_id": "....", "name": "cccc", "level_max_leaves": [{ level: "ObjectIdString 1", max_leaves: 7, }] }, { "_id": "....", "name": "dddd", "level_max_leaves": [{ level: "ObjectIdString 2", max_leaves: 3, }] }] 

现在我需要总结具有ObjectIdString 1max_leaves的字段?

(4+4+7=15)

到目前为止我尝试过

 var empLevelId = 1234... ; MyModel.aggregate( {$unwind: "$level_max_leaves.level"}, {$match: {"$level_max_leaves.level": empLevelId } }, {$group: { "_id": "$level_max_leaves.level", "total": { "$sum": "$level_max_leaves.max_leaves" }}}, function (err, res) { console.log(res); }); 

如何做到这一点?

通常,在处理聚合框架中的数组时,您需要首先$unwind数组内容。 这个“解除规范”的内容作为单独的文件。 从这里正常的分组操作按预期工作:

 MyModel.aggregate([ // Unwind to "de-normalize" { "$unwind": "$level_max_leaves" }, // Group as expected { "$group": { "_id": "$level_max_leaves.level", "total": { "$sum": "$level_max_leaves.max_leaves" } }} ],function(err,result) { // process results here }); 

还要注意,寻址元素时需要“绝对”path。