【问题标题】:MongoDB - Find duplicated elements in record propertyMongoDB - 在记录属性中查找重复的元素
【发布时间】:2019-08-27 23:35:56
【问题描述】:

我正在努力识别我的 MongoDB 记录中的重复元素,这是我的问题:

我有一个名为“元素”的 Mongo 集合。

此集合中的记录示例:

{
    "_id" : ObjectId("5d1b2204e851271e80c824b6"),
    "name" : "A",
    "items" : [ 
        {
            "ref_id" : ObjectId("5d1b2204e851271e80c823d7"),
            "_id" : ObjectId("5d1b2205e851271e80c82534")
        }, 
        {
            "ref_id" : ObjectId("5d1b2204e851271e80c823d6"),
            "_id" : ObjectId("5d1b2205e851271e80c82533")
        }, 
        {
            "ref_id" : ObjectId("5d1b2204e851271e80c823d8"),
            "_id" : ObjectId("5d1b2205e851271e80c82532")
        }, 
        {
            "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
            "_id" : ObjectId("5d1b3048e851271e80c826a5")
        }, 
        {
            "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
            "_id" : ObjectId("5d1b3048e851271e80c826ad")
        }
    ]
}

我想识别数组“items”包含具有相同“ref_id”的对象的记录。

在我的示例中,我们可以看到“items”数组的最后两个对象具有相同的“ref_id”:ObjectId("5d1b2204e851271e80c823d5")

我尝试了一堆聚合函数,但不幸的是无法提出解决方案。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    以下查询可以得到我们预期的输出:

    db.elements.aggregate([
        {
            $unwind:"$items"
        },
        {
            $group:{
                "_id":"$_id",
                "root":{
                    $first:"$$ROOT"
                },
                "items":{
                    $push:"$items"
                },
                "distinctItems":{
                    $addToSet: "$items.ref_id"
                }
            }
        },
        {
            $match:{
                $expr:{
                    $ne:[
                        {
                            $size:"$items"
                        },
                        {
                            $size:"$distinctItems"
                        }
                    ]
                }
            }
        },
        {
            $addFields:{
                "root.items":"$items"
            }
        },
        {
            $replaceRoot:{
                "newRoot":"$root"
            }
        }
    ]).pretty()
    

    数据集:

    {
        "_id" : ObjectId("5d1b2204e851271e80c824b6"),
        "name" : "A",
        "items" : [
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d7"),
                "_id" : ObjectId("5d1b2205e851271e80c82534")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d6"),
                "_id" : ObjectId("5d1b2205e851271e80c82533")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d8"),
                "_id" : ObjectId("5d1b2205e851271e80c82532")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
                "_id" : ObjectId("5d1b3048e851271e80c826a5")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
                "_id" : ObjectId("5d1b3048e851271e80c826ad")
            }
        ]
    }
    {
        "_id" : ObjectId("5d654b9d7d0ab652c42315f2"),
        "name" : "B",
        "items" : [
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d7"),
                "_id" : ObjectId("5d1b2205e851271e80c82534")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d6"),
                "_id" : ObjectId("5d1b2205e851271e80c82533")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d8"),
                "_id" : ObjectId("5d1b2205e851271e80c82532")
            }
        ]
    }
    

    输出:

    {
        "_id" : ObjectId("5d1b2204e851271e80c824b6"),
        "name" : "A",
        "items" : [
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d7"),
                "_id" : ObjectId("5d1b2205e851271e80c82534")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d6"),
                "_id" : ObjectId("5d1b2205e851271e80c82533")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d8"),
                "_id" : ObjectId("5d1b2205e851271e80c82532")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
                "_id" : ObjectId("5d1b3048e851271e80c826a5")
            },
            {
                "ref_id" : ObjectId("5d1b2204e851271e80c823d5"),
                "_id" : ObjectId("5d1b3048e851271e80c826ad")
            }
        ]
    }
    

    解释:我们正在从每个文档中填充一个不同的 ref_id 数组,并匹配填充数组的大小是否等于实际 items 数组的大小。

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 2020-02-07
      • 2014-01-13
      • 2015-11-27
      • 2020-03-26
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多