【问题标题】:Finding ID of mongo documents with duplicated elements in nested array在嵌套数组中查找具有重复元素的 mongodb 文档的 ID
【发布时间】:2021-09-18 13:44:12
【问题描述】:

我想从集合中提取文档的 ID,这些文档的 ID 具有重复的“驱动器”对象 ID,这些对象嵌套在“streetModel”中的数组中。
这是我的典型文档:

  {
    "_id": {
        "$oid": "61375bec4fa522001b608568"
    },
    "name": "Streetz",
    "statusDetail": {},
    "streetModel": {
        "_id": "3.7389-51.0566",
        "name": "Kosheen - Darude - Swedish - Trynidad - Maui",
        "countryCode": "DEN",
        "drives": [{
            "_id": -903500698,
            "direction": "WEST"
            }, {
            "_id": 1915399546,
            "direction": "EAST"
            }, {
            "_id": 1294835467,
            "direction": "NORTH"
            }, {
            "_id": 1248969937,
            "direction": "EAST"
            }, {
            "_id": 1248969937,
            "direction": "EAST"
            }, {
            "_id": 1492411786,
            "direction": "SOUTH"
                }]
    },
    "createdAt": {
            "$date": "2021-09-07T12:32:44.238Z"
        }
    }

在这个 ID 为 61375bec4fa522001b608568 的特定文档中,在“streetModel”的“drives”数组中,我得到了 ID 为 1248969937 的重复驱动器对象。
我想创建一个对数据库的查询,该查询将返回所有存在此类问题的文档的 ID(重复的“驱动器”)。
现在我得到了这个:

db.streets.aggregate([
  {
    $unwind: "$streetModel"
  },
  {
    $unwind: "$drives"
  },
  {
    $group: {
      _id: {
        id: "$_id"
      },
      sum: {
        $sum: 1
      },

    }
  },
  {
    $match: {
      sum: {
        $gt: 1
      }
    }
  },
  {
    $project: {
      _id: "$_id._id",
      duplicates: {
        drives: "$_id"
      }
    }
  }
])

但事实并非如此。
我尝试了很多方法来重写这个查询,但不幸的是它不起作用。

【问题讨论】:

    标签: database mongodb mongodb-query nosql nosql-aggregation


    【解决方案1】:

    查询

    • 放松
    • 按文档 ID + 驱动程序 ID 分组
    • 仅保留具有多个相同驱动 ID 的那些
    • replace-root 是为了让文档更好看,你也可以用 $project 代替
    • 如果您需要更多阶段,我认为您可以添加它,例如获取有此问题项目的文档仅 docid 的

    Test code here

    db.collection.aggregate([
      {
        "$unwind": {
          "path": "$streetModel.drives"
        }
      },
      {
        "$group": {
          "_id": {
            "docid": "$_id",
            "driveid": "$streetModel.drives._id"
          },
          "duplicates": {
            "$push": "$streetModel.drives.direction"
          }
        }
      },
      {
        "$match": {
          "$expr": {
            "$gt": [
              {
                "$size": "$duplicates"
              },
              1
            ]
          }
        }
      },
      {
        "$replaceRoot": {
          "newRoot": {
            "$mergeObjects": [
              "$_id",
              "$$ROOT"
            ]
          }
        }
      },
      {
        "$project": {
          "_id": 0
        }
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多