如何在MongoDB中计算sum(a)/sum(b)并将结果写入新字段
操作方案
以下基于MongoDB常用版本提供两种不同需求的实现方式:
场景1:将全局sum(a)/sum(b)比值写入原集合所有文档的新字段
版本要求:MongoDB 4.2及以上(支持聚合更新)
直接通过单条updateMany命令完成计算+写入:
db.你的集合名.updateMany( {}, // 匹配集合内全部文档 [ // 计算全局a、b字段总和,同时暂存所有原文档数据 { $group: { _id: null, sumA: { $sum: "$a" }, sumB: { $sum: "$b" }, docs: { $push: "$$ROOT" } } }, // 计算目标比值 { $addFields: { ratio_ab: { $divide: ["$sumA", "$sumB"] } } }, // 拆分暂存的文档数组,恢复为单文档结构 { $unwind: "$docs" }, // 把比值注入原文档后写回集合 { $replaceRoot: { newRoot: { $mergeObjects: ["$docs", { ratio_ab: "$ratio_ab" }] } } } ] )
低版本兼容方案(MongoDB 4.2以下)
分两步执行:先计算比值,再批量更新
// 第一步:聚合查询得到总和与比值 const statResult = db.你的集合名.aggregate([ { $group: { _id: null, sumA: { $sum: "$a" }, sumB: { $sum: "$b" } } } ]).toArray()[0] const targetRatio = statResult.sumA / statResult.sumB // 第二步:把比值写入所有文档的新字段 db.你的集合名.updateMany({}, { $set: { ratio_ab: targetRatio } })
场景2:仅将统计结果单独存储到新集合
如果不需要修改原集合,只需要留存统计值,可以用聚合管道的$out阶段直接写入新集合:
db.你的集合名.aggregate([ { $group: { _id: null, sumA: { $sum: "$a" }, sumB: { $sum: "$b" } } }, { $addFields: { ratio_ab: { $divide: ["$sumA", "$sumB"] } } }, // 结果写入名为collection_stats的新集合 { $out: "collection_stats" } ])
你示例中的数据执行后得到的ratio_ab值为2.1875,和你预期的350/160计算结果一致。
内容的提问来源于stack exchange,提问作者jnh123
相关产品推荐
相关产品推荐

