MongoDB聚合分组求和:单条mon字段先保留两位小数再求和
MongoDB聚合查询实现单条记录先舍入后求和方案
错误原因
你的聚合语句存在逻辑顺序错误:
- 第一阶段
$group只保留了_id字段,所有文档的mon字段在分组后全部丢失,后续$project阶段无法读取到$mon的取值,因此计算结果为0 - 需求要求先对每条文档的
mon单独处理再求和,处理单条字段的逻辑需要放在分组求和之前执行
正确实现
MongoDB 4.2及以上版本(推荐,内置$round运算符)
直接使用$round完成单条记录的四舍五入,再分组累加:
db.test.aggregate([ // 对每条记录的mon字段四舍五入保留2位小数 { $addFields: { roundedMon: { $round: ["$mon", 2] } } }, // 按name分组,累加处理后的值 { $group: { _id: "$name", total_count: { $sum: "$roundedMon" } } }, // 调整输出字段格式,匹配需求 { $project: { _id: 0, name: "$_id", total_count: 1 } } ])
低版本兼容写法(无$round运算符场景)
沿用你原来的截断逻辑,同样先处理单条记录再分组:
db.test.aggregate([ { $addFields: { roundedMon: { $divide: [ { $trunc: { $add: [ { $multiply: ["$mon", 100] }, 0.5 ] } }, 100 ] } } }, { $group: { _id: "$name", total_count: { $sum: "$roundedMon" } } }, { $project: { _id: 0, name: "$_id", total_count: 1 } } ])
结果验证
三条记录单独处理后的值分别为:
- 100.7645234 → 100.76
- 1.23734324 → 1.24
- 1.785233 → 1.79
累加结果为100.76+1.24+1.79=103.79,和预期一致。
内容的提问来源于stack exchange,提问作者admin crazy
相关产品推荐
相关产品推荐

