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

在MongoDB中如何对比文档并按user_id字段去重?

MongoDB按user_id字段去重实现方案

该操作完全可以在MongoDB中实现,以下是两种常用的落地方式:

重要提示:操作前请先对集合A做全量备份,避免误删数据无法恢复

方案1:生成去重后的新集合(不改动原集合,推荐测试阶段使用)

通过聚合管道将去重后的结果写入新集合,不会修改原集合数据,每个user_id默认保留最早插入的1条文档:

db.A.aggregate([
  {
    $group: {
      _id: "$user_id",
      // 若需要保留对应user_id最新插入的文档,将$first改为$last即可
      reserved_doc: { $first: "$$ROOT" }
    }
  },
  // 还原文档原始结构
  { $replaceRoot: { newRoot: "$reserved_doc" } },
  // 结果写入新集合A_dedup
  { $out: "A_dedup" }
])

执行完成后新集合A_dedup就是完全去重后的结果。

方案2:直接在原集合删除重复文档

如果确认可以直接修改原集合,可以先查询出所有需要删除的重复文档ID,再批量删除:

let toDeleteIds = [];
// 按user_id分组,筛选出每个分组除保留项外的所有文档ID
db.A.aggregate([
  {
    $group: {
      _id: "$user_id",
      // 保留最早插入的文档ID,要保留最新就改为$last
      keep_id: { $first: "$_id" },
      all_ids: { $push: "$_id" }
    }
  },
  {
    $project: {
      _id: 0,
      // 排除要保留的ID,剩下的就是待删除的ID
      delete_ids: { $setDifference: ["$all_ids", ["$keep_id"]] }
    }
  }
]).forEach(item => {
  toDeleteIds = toDeleteIds.concat(item.delete_ids);
});
// 批量删除重复文档
db.A.deleteMany({ _id: { $in: toDeleteIds } });

后续优化(可选)

去重完成后可以给user_id字段添加唯一索引,避免后续再产生重复数据:

db.A.createIndex({ user_id: 1 }, { unique: true })

如果需要按特定规则保留文档(比如保留距离货架最近的、日期最新的),只需要在$group阶段前添加$sort阶段按对应字段排序即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:39:00