【问题标题】:MonogoDB: Deleting duplicate sub-documentsMongoDB:删除重复的子文档
【发布时间】:2021-09-24 17:16:56
【问题描述】:

作为 MongoDB 的新手,我发现这很有挑战性。如果子文档字段具有特定值,我需要删除除 1 个子文档之外的所有子文档。

以下是源 MongoDB 文档和子文档的示例:

{
  _id: <some_UUID>,
  fieldA: "<some_fieldA_value>,
  subDocA: [
    {
      subFieldA: "aaa",
      subFieldB: "bbb"
    },
    {
      subFieldA: "aaa",
      subFieldB: "ccc"
    },
    {
      subFieldA: "aa1",
      subFieldB: "ddd"
    }
  ]
}

目标 MongoDb 文档应该是:

{
  _id: <some_UUID>,
  fieldA: "<some_fieldA_value>,
  subDocA: [
    {
      subFieldA: "aaa",
      subFieldB: "bbb"
    },
    {
      subFieldA: "aa1",
      subFieldB: "ddd"
    }
  ]
}

即如果子文档字段subFieldA=aaa,则在父文档中只保留1个这样的子文档。

有人可以帮助我提出 MongoDB 查询吗?提前致谢。

编辑:

子文档的其他字段的值可能不同。集合中可能有很多这样的文档我需要做同样的事情。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以试试这个聚合管道。

    • 首先 $unwind 解构数组。
    • 然后$group 两次:第一次按subFieldA 值分组以获得$first 一个。第二次得到原结构。
    db.collection.aggregate([
      {
        "$unwind": "$subDocA"
      },
      {
        "$group": {
          "_id": "$subDocA.subFieldA",
          "subDocA": {
            "$first": "$subDocA"
          },
          "fieldA": {
            "$first": "$fieldA"
          },
          "id": {
            "$first": "$_id"
          }
        }
      },
      {
        "$group": {
          "_id": "$id",
          "fieldA": {
            "$first": "$fieldA"
          },
          "subDocA": {
            "$push": "$subDocA"
          }
        }
      }
    ])
    

    例如here

    【讨论】:

    • 感谢您的回复,但我最初的问题并没有具体说明。我更新了问题 - 子文档可能没有相同的其他字段,因此 $setToUnion 不起作用。基本上,我需要删除所有 subFieldA=aaa 的子文档,除了 1。
    • 嗨@MB1986,很抱歉误解了你的问题,我已经编辑了这个问题,我认为这是一个更好的方法。
    猜你喜欢
    • 2015-05-15
    • 2021-11-27
    • 2023-03-28
    • 2012-07-30
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多