Mongo为两个或多个字段的条目查找重复项

时间:2016-02-25 10:23:15

标签: mongodb mongodb-query aggregation-framework

我有这样的文件:

{
    "_id" : ObjectId("557eaf444ba222d545c3dffc"),
    "foreing" : ObjectId("538726124ba2222c0c0248ae"),
    "value" : "test",
}

我想查找对foreing&对的所有重复值的文档。 value

2 个答案:

答案 0 :(得分:21)

您可以通过运行以下聚合管道操作轻松识别重复项:

db.collection.aggregate([
    { 
        "$group": { 
            "_id": { "foreing": "$foreing", "value": "$value" }, 
            "uniqueIds": { "$addToSet": "$_id" },
            "count": { "$sum": 1 } 
        }
    }, 
    { "$match": { "count": { "$gt": 1 } } }
])

第一步中的 $group 运算符用于按foreignvalue键值对文档进行分组,然后创建一个{{{使用 $addToSet 运算符将每个分组文档的值设置为_id字段。这为您提供了每组的唯一表达式值数组。使用 $sum 运算符获取要在后续管道阶段中使用的分组文档总数。

在第二个管道阶段,使用 $match 运算符过滤掉所有计数为1的文档。过滤掉的文档代表唯一索引键。

其余文档将是集合中具有对uniqueIds&对的重复键值的文档。 foreing

答案 1 :(得分:12)

我们只需要在2个键的基础上进行分组,并选择计数大于1的元素,以查找重复项。

查询: - 就像

db.mycollection.aggregate(
    { $group: { 
        _id: { foreing: "$foreing", value: "$value" },
        count: { $sum:  1 },
        docs: { $push: "$_id" }
    }},
    { $match: {
        count: { $gt : 1 }
    }}
)

输出: - 就像

{
    "result" : [
        {
            "_id" : {
                "foreing" : 1,
                "value" : 2
            },
            "count" : 2,
            "docs" : [
                ObjectId("34567887654345678987"),
                ObjectId("34567887654345678987")
            ]
        }
    ],
    "ok" : 1
}

参考链接: - How to find mongo documents with a same field