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

MongoDB嵌入式多关系去重方案咨询:支持聚合管道实现

MongoDB 文档entries数组去重方案

一、找出所有存在重复entries的文档

如果只需要先定位包含重复key的文档,后续手动处理,用以下聚合管道:

db.collection.aggregate([
  // 展开entries数组
  { $unwind: "$entries" },
  // 按文档ID和entries.key分组,统计每个key的出现次数
  {
    $group: {
      _id: {
        docId: "$_id",
        key: "$entries.key"
      },
      count: { $sum: 1 }
    }
  },
  // 筛选出现次数大于1的分组(即存在重复key的文档)
  { $match: { count: { $gt: 1 } } },
  // 提取文档ID并去重,避免同一文档多次输出
  { $project: { _id: "$_id.docId" } },
  { $group: { _id: "$_id" } }
])

这个管道会返回所有存在重复key的文档ID列表,你可以用这些ID查询原文档进行后续处理。

二、单个聚合管道完成entries数组去重

如果要直接生成去重后的文档,保留每个key第一次出现的条目(和你给出的预期结果一致),用以下聚合管道:

db.collection.aggregate([
  // 展开entries数组,同时记录每个条目在原数组的索引
  { $unwind: { path: "$entries", includeArrayIndex: "index" } },
  // 按文档ID和entries.key分组,取每个key第一次出现的条目(索引最小的)
  {
    $group: {
      _id: {
        docId: "$_id",
        key: "$entries.key"
      },
      firstEntry: { $first: "$entries" },
      minIndex: { $min: "$index" }
    }
  },
  // 按文档ID和索引排序,保证条目顺序和原数组一致
  {
    $sort: {
      "_id.docId": 1,
      minIndex: 1
    }
  },
  // 按文档ID重新分组,将去重后的entries组合成数组
  {
    $group: {
      _id: "$_id.docId",
      entries: { $push: "$firstEntry" }
    }
  },
  // 可选:直接更新原集合,去掉注释并替换集合名称
  // { $merge: { into: "your_collection_name", on: "_id" } }
])

说明:

  • 通过includeArrayIndex记录条目位置,确保去重后保留的是原数组中第一个出现的key对应的条目。
  • 若需要直接覆盖原集合数据,启用最后的$merge阶段即可,注意替换your_collection_name为你的实际集合名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:20:44