如何在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" } } } ])
步骤说明
- $addFields阶段:利用MongoDB的数组聚合运算符
$sum,直接对每个员工的bonus.amount数组求和,生成employee_total_bonus字段,每个员工仅保留一条完整数据,不会被拆分。 - $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
相关产品推荐
相关产品推荐

