MongoDB应使用什么聚合函数删除empId与enrollDate重复记录
MongoDB 重复数据删除方案
要实现按empId和enrollDate去重,你需要用到MongoDB的$group聚合算子,具体操作如下:
操作步骤
1. 确认待保留的记录ID
首先通过聚合查询,按empId和enrollDate分组,每组保留1条记录的ID:
// 执行聚合得到所有需要保留的记录ID const keepIdList = db.你的集合名.aggregate([ { $group: { _id: { empId: "$empId", enrollDate: "$enrollDate" }, // 每组取第一条记录的_id作为保留ID,想保留最晚插入的就换成$last reservedId: { $first: "$_id" } } }, { $project: { _id: 0, reservedId: 1 } } ]).map(item => item.reservedId)
2. 预校验待删除数据
执行删除前务必先确认待删除的记录符合预期,避免误删:
// 查询所有需要删除的重复记录,确认数量和内容是否正确 db.你的集合名.find({ _id: { $nin: keepIdList } })
3. 执行删除操作
确认无误后执行删除:
db.你的集合名.deleteMany({ _id: { $nin: keepIdList } })
大数据量场景更安全的可选方案
如果你的数据量很大,怕直接删除出问题,可以先把去重后的结果写入新集合,校验无误后再替换原集合:
// 去重后的数据写入新集合 db.你的集合名.aggregate([ { $group: { _id: { empId: "$empId", enrollDate: "$enrollDate" }, doc: { $first: "$$ROOT" } } }, { $replaceRoot: { newRoot: "$doc" } }, { $out: "去重后的新集合名" } ]) // 确认新集合数据正确后,删除原集合,重命名新集合为原集合名即可
内容的提问来源于stack exchange,提问作者Sandeep Deshpande
相关产品推荐
相关产品推荐

