You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:06:03