MongoDB中计算对象总价值及按ID分组求和的问题求助
MongoDB聚合:计算总价值与按ID分组求和
嘿,我来帮你搞定这个MongoDB聚合的问题~你之前用$project里的$sum没法得到正确的跨文档总和,原因很简单:$project阶段的$sum只能针对单个文档内的字段(比如数组或多个字段)求和,没办法跨文档累加所有value的值。要实现你的需求,我们得用$group阶段来完成分组和求和操作。
一、计算所有文档的总价值
如果要把所有文档的value加起来得到一个总数值,你可以把$group的_id设为null(表示将所有文档归为一个组),然后用$sum累加每个文档的value:
db.invoices.aggregate([ { $group: { _id: null, totalAll: { $sum: "$value" } } } ])
针对你的示例数据,这个查询会返回{ "_id" : null, "totalAll" : 145944 }(6个文档,每个value为24324,6×24324=145944)。
二、按id分组计算对应价值总和
如果要按id分组,把相同id的文档value累加起来,只需要把$group的_id设为$id即可。MongoDB会自动把拥有相同id的文档归为一组,同时也会把没有id字段的文档单独归为一组(_id为null):
db.invoices.aggregate([ { $group: { _id: "$id", totalById: { $sum: "$value" } } } ])
针对你的示例数据,这个查询会返回两个结果:
- 对应
id: "12345"的组:{ "_id" : "12345", "totalById" : 121620 }(5个文档,5×24324=121620) - 没有
id的组:{ "_id" : null, "totalById" : 24324 }
如果之后需要对结果做进一步处理(比如重命名字段、过滤分组),还可以在$group后面继续添加其他聚合阶段(比如$project或$match)。
内容的提问来源于stack exchange,提问作者Hasibul-
相关产品推荐
相关产品推荐

