【问题标题】:get document with same 3 fields in a collection获取集合中具有相同 3 个字段的文档
【发布时间】:2023-01-12 01:32:37
【问题描述】:

我有一个包含超过 1000 个文档的集合,并且在某些领域有一些具有相同价值的文档,我需要得到那些

该系列是:

[{_id,fields1,fields2,fields3,etc...}]

我可以使用什么查询来获取具有相同 3 个字段的所有元素,例如:

[
 {_id:1,fields1:'a',fields2:1,fields3:'z'},
 {_id:2,fields1:'a',fields2:1,fields3:'z'},
 {_id:3,fields1:'f',fields2:2,fields3:'g'},
 {_id:4,fields1:'f',fields2:2,fields3:'g'},
 {_id:5,fields1:'j',fields2:3,fields3:'g'},
]

我需要得到

[
 {_id:2,fields1:'a',fields2:1,fields3:'z'},
 {_id:4,fields1:'f',fields2:2,fields3:'g'},
]

通过这种方式,我可以很容易地获得一个“重复”列表,如果需要我可以删除它,获取 id 2 和 4 或 1 和 3 并不重要

但 5 永远不会被包括在内,因为它不是“重复的”

编辑: 对不起,但我忘了提到有一些文档具有空值,我需要排除那些

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我想你可以试试这个聚合查询:

    • 如果有多个值,首先按您想知道的字段分组。
    • 它使用重复的_ids 创建一个数组。
    • 然后只在有多个的地方获取($match)。
    • 最后一个项目以获得所需的输出。我使用了第一个找到的_id
    db.collection.aggregate([
      {
        "$group": {
          "_id": {
            "fields1": "$fields1",
            "fields2": "$fields2",
            "fields3": "$fields3"
          },
          "duplicatesIds": {
            "$push": "$_id"
          }
        }
      },
      {
        "$match": {
          "$expr": {
            "$gt": [
              {
                "$size": "$duplicatesIds"
              },
              1
            ]
          }
        }
      },
      {
        "$project": {
          "_id": {
            "$arrayElemAt": [
              "$duplicatesIds",
              0
            ]
          },
          "fields1": "$_id.fields1",
          "fields2": "$_id.fields3",
          "fields3": "$_id.fields2"
        }
      }
    ])
    

    例子here

    【讨论】:

      【解决方案2】:

      您可以使用 $setWindowFields 在您想要的分组/分区中计算 $rank。然后,让那些排名不等于 1 的人得到重复项。

      db.collection.aggregate([
        {
          "$setWindowFields": {
            "partitionBy": {
              fields1: "$fields1",
              fields2: "$fields2",
              fields3: "$fields3"
            },
            "sortBy": {
              "_id": 1
            },
            "output": {
              "duplicateRank": {
                "$rank": {}
              }
            }
          }
        },
        {
          $match: {
            duplicateRank: {
              $ne: 1
            }
          }
        },
        {
          $unset: "duplicateRank"
        }
      ])
      

      Mongo Playground

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多