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

MongoDB聚合按月分组时$addToSet丢失重复同值记录问题

问题根因

$addToSet是MongoDB聚合中的数组去重操作符,只会向数组中添加不存在的元素,遇到完全一致的元素会自动去重仅保留1份。当多条记录的所有字段值完全相同时,就会出现transactions数组缺漏记录的问题。
注:MongoDB默认会为每条插入的文档生成全局唯一的_id字段,如果你的业务文档没有手动移除_id,正常情况下哪怕date和amount完全一致,_id的差异也会让$addToSet判定为不同文档,出现你描述的问题大概率是插入数据时显式移除了默认_id,或聚合前的匹配/投影阶段把_id字段过滤掉了。

修复方案

把分组阶段transactions字段使用的$addToSet替换为$push操作符即可。$push不会做任何去重判断,会将分组匹配到的所有文档全量加入数组,且不会影响原有amount字段的求和逻辑。
修改后的聚合配置如下:

match = { // 部分匹配查询条件}
group = {
  _id: { 
    month: { $substr: ['$date', 5, 2] }, 
    year: { $substr: ['$date', 0, 4] } 
  },
  amount: { $sum: "$amount" },
  transactions: { $push: "$$ROOT"}
}
可选优化

如果后续有对transactions数组按业务字段去重的需求,可以在分组完成后追加聚合阶段,使用$setUnion等数组操作符按指定字段去重,不需要在分组阶段用$addToSet提前处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:27:09