MongoDB聚合:为所有文档添加values全局求和的sum字段
给集合所有文档添加全局values总和的sum字段
需求说明
需要计算集合中所有文档values字段的总和,并将该值作为sum字段添加到每一条原始文档中。之前尝试用$group操作,但只会返回单条聚合结果,现在要保留所有原始文档同时附带计算出的sum值。
示例原始文档
[ { "_id": ObjectId("5407c76b7b1c276c74f90524"), "field": "x", "values": 1 }, { "_id": ObjectId("5407c76b7b1c276c74f90525"), "field": "x", "values": 1 }, { "_id": ObjectId("5407c76b7b1c276c74f90526"), "field": "z", "values": 1 }, { "_id": ObjectId("5407c76b7b1c276c74f90527"), "field": "x", "values": 1 }, { "_id": ObjectId("5407c76b7b1c276c74f90528"), "field": "z", "values": 1 }, { "_id": ObjectId("5407c76b7b1c276c74f90529"), "field": "y", "values": 1 } ]
预期结果
[ { "_id": ObjectId("5407c76b7b1c276c74f90524"), "field": "x", "values": 1, "sum": 6 }, { "_id": ObjectId("5407c76b7b1c276c74f90525"), "field": "x", "values": 1, "sum": 6 }, { "_id": ObjectId("5407c76b7b1c276c74f90526"), "field": "z", "values": 1, "sum": 6 }, { "_id": ObjectId("5407c76b7b1c276c74f90527"), "field": "x", "values": 1, "sum": 6 }, { "_id": ObjectId("5407c76b7b1c276c74f90528"), "field": "z", "values": 1, "sum": 6 }, { "_id": ObjectId("5407c76b7b1c276c74f90529"), "field": "y", "values": 1, "sum": 6 } ]
解决方案
方法一:传统聚合管道组合(兼容全版本)
使用$group、$unwind、$replaceRoot组合实现:
db.yourCollectionName.aggregate([ // 计算全局总和并保存所有原始文档 { $group: { _id: null, totalSum: { $sum: "$values" }, docs: { $push: "$$ROOT" } } }, // 拆分保存的文档数组 { $unwind: "$docs" }, // 合并原始文档与sum字段,恢复原始结构 { $replaceRoot: { newRoot: { $mergeObjects: [ "$docs", { sum: "$totalSum" } ] } } } ])
方法二:窗口函数简化实现(MongoDB 4.2+)
用$setWindowFields一步完成全局计算:
db.yourCollectionName.aggregate([ { $setWindowFields: { partitionBy: null, // 全局范围计算 sortBy: {}, // 无需排序 output: { sum: { $sum: "$values", window: { documents: ["unbounded", "unbounded"] } } } } } ])
步骤说明
- 方法一中,
$group负责汇总总和与原始文档,$unwind拆分数组,$replaceRoot合并字段恢复结构; - 方法二利用窗口函数直接计算全局范围内的
values总和,代码更简洁高效。
内容的提问来源于stack exchange,提问作者reis12341
相关产品推荐
相关产品推荐

