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

如何在MongoDB中计算数组总和?规避$unwind导致的数据重复问题

计算总薪资与总奖金(避免$unwind导致的重复计算)

直接用$unwind展开bonus数组确实会导致同一条员工数据被拆分多次,计算薪资总和时会重复累加,完全没必要。可以先计算每个员工的个人奖金总和,再做全局汇总,全程不用$unwind:

聚合查询代码

db.collection.aggregate([
  // 给每个员工新增字段,计算其个人奖金总和
  {
    $addFields: {
      employee_total_bonus: { $sum: "$bonus.amount" }
    }
  },
  // 全局分组汇总总薪资与总奖金
  {
    $group: {
      _id: null,
      total_salary: { $sum: "$salary" },
      total_bonus: { $sum: "$employee_total_bonus" }
    }
  }
])

步骤说明

  1. $addFields阶段:利用MongoDB的数组聚合运算符$sum,直接对每个员工的bonus.amount数组求和,生成employee_total_bonus字段,每个员工仅保留一条完整数据,不会被拆分。
  2. $group阶段:通过_id: null做全局分组,分别对所有员工的salary和employee_total_bonus求和,得到最终的总薪资与总奖金。

结果验证

对应你提供的示例数据,运行后会得到:

{ "_id" : null, "total_salary" : 25000, "total_bonus" : 15000 }

完全符合预期(总薪资12000+13000=25000,总奖金(3000+4000)+(2000+6000)=15000)。

内容的提问来源于stack exchange,提问作者BharatProteemGogoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:29:56