MongoDB中对users集合OBJECTS字段求和并返回原文档
解决MongoDB返回所有文档+OBJECTS字段总和的需求
嘿,刚好我对MongoDB聚合操作挺熟的,来帮你搞定这个需求——既要返回users集合里的所有原文档,又要计算OBJECTS字段的总和对吧?
方法一:用$group直接聚合(简洁版)
这个方法一步到位,通过$group把所有文档收集到数组里,同时计算总和:
db.users.aggregate([ { $group: { _id: null, // 按null分组,把所有文档归为一组 documents: { $push: "$$ROOT" }, // 把每个完整文档存入documents数组 totalObjects: { $sum: "$OBJECTS" } // 对所有文档的OBJECTS字段求和 } }, { $project: { _id: 0 } // 去掉不需要的_id字段,让结果更干净 } ])
方法二:用$facet拆分聚合逻辑(更清晰)
如果想要把“获取文档”和“计算总和”的逻辑分开,$facet是个不错的选择,它允许在一个聚合管道里同时执行多个子管道:
db.users.aggregate([ { $facet: { "documents": [ { $match: {} } ], // 子管道1:匹配所有文档,返回原数据 "total_objects": [ { $group: { _id: null, sum: { $sum: "$OBJECTS" } } }, // 子管道2:计算总和 { $project: { _id: 0 } } // 去掉子管道结果里的_id ] } }, { $project: { documents: 1, totalObjects: { $arrayElemAt: [ "$total_objects.sum", 0 ] } // 把总和从数组转为单个值 } } ])
结果示例
不管用哪种方法,最终返回的结果结构都会是这样(对应你给出的示例文档):
{ "documents": [ { "_id": <user_id>, "NAME": "ABC", "TIME": 53.0, "OBJECTS": 1 }, { "_id": <user_id>, "NAME": "ABCD", "TIME": 353.0, "OBJECTS": 70 } ], "totalObjects": 71 }
简单解释下关键知识点:
$$ROOT:代表当前处理的整个文档,用$push就能把所有原文档完整保存下来$sum: "$OBJECTS":对分组内所有文档的OBJECTS字段值求和$facet:适合在一次聚合中完成多个独立的统计/查询操作,逻辑拆分更清晰
内容的提问来源于stack exchange,提问作者Naman
相关产品推荐
相关产品推荐

