为何`_id`会阻碍MongoDB聚合的`setUnion`/`addToSet`识别唯一对象?
聚合去重场景异常记录
- 目标业务场景:在MongoDB聚合管道中跨文档合并
newPMList数组,过滤完全重复的数组元素,返回全局唯一的元素集合 - 观察到的反常现象:当数组元素包含
_id字段时,setUnion、addToSet两个原生去重算子,无法识别内容完全一致的嵌套对象 - 对照测试差异:
- 保留嵌套对象原有
_id字段时,去重逻辑失效 - 剔除嵌套对象的
_id字段后,去重逻辑可正常运行
- 保留嵌套对象原有
单条文档内newPMList的参考结构如下,相同结构的对象会在不同文档中重复出现:
"newPMList": [ { /** 原示例中注释标注的字段为嵌套对象自带的 `_id` "_id": "5feb10c4906c880076ce5fa6", */ "project": "5feb10b6906c880076ce5fa5", "market": "5feb0f44906c880076ce5f9d", "url": "https://www.example.com/place", "createdAt": "2020-12-29T11:19:32.945Z", "updatedAt": "2020-12-29T11:19:32.945Z", "__v": 0 } ]
排查结论
- 在本地真实MongoDB实例上运行完全相同的聚合逻辑,功能运行正常,不存在
_id字段阻碍去重判断的问题 - 异常仅出现在在线测试平台的运行环境中
- 环境异常原因推测:该在线测试平台在将测试数据提交给后端Mongo服务前,会对测试数据做预处理:移除测试数据中原有的
_id字段,为每个顶层文档、每个嵌套对象重新生成全新的随机_id,导致原本内容完全一致的嵌套对象被注入了不同的_id值,最终被去重算子判定为非重复对象,该推测暂未得到平台官方证实 - 问题属性判断:该异常不属于MongoDB聚合本身的逻辑缺陷,没有通用的排查参考价值,若没有额外讨论必要,可直接删除该问题记录
内容的提问来源于stack exchange,提问作者Gibbs
相关产品推荐
相关产品推荐

