在MongoDB中查找重复的记录


116

我将如何在mongo集合中找到重复的字段。

我想检查“名称”字段是否重复。

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}

非常感谢!


5
这个问题的重复标志是不应该的。此问题询问如何查找重复记录,而不是防止重复记录。
哈里·金

Answers:


209

在使用聚合name,并得到namecount > 1

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

要将结果按最多至最少重复项进行排序:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
)

要与“ name”以外的其他列名一起使用,请将$ name ” 更改为“ $ column_name


1
"$match": {"_id" :{ "$ne" : null } -在这里是不必要的,因为语句的第二部分足以过滤结果。因此,仅检查具有的组即可count > 1
BatScream 2014年

5
谢谢@BatScream。{'$ ne“:null}是为了防止'name'为null或不存在。聚合也将计为空。
anhlc 2014年

1
欢迎。但是,为什么要检查该_id字段。始终保证该group操作后不为null 。
BatScream 2014年

4
_id从一个文档的$group阶段,可以为空。
wdberkeley14年

1
这将是什么输出?如果我运行,我会得到所有文件,我只需要重复的ID /名称。
Kannan T

24

你可以找到listduplicate使用下列名称aggregate管道:

  • Group所有记录都相似name
  • Match那些groups有记录大于1
  • 然后group再次将project所有重复的名称作为array

代码:

db.collection.aggregate([
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}},
{$match:{"count":{$gt:1}}},
{$project:{"name":1,"_id":0}},
{$group:{"_id":null,"duplicateNames":{$push:"$name"}}},
{$project:{"_id":0,"duplicateNames":1}}
])

o / p:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }

10

如果您的数据库很大并且属性名称仅出现在某些文档中,那么anhic给出的答案可能会非常无效。

为了提高效率,您可以在聚合中添加$ match。

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

3
db.getCollection('orders').aggregate([  
    {$group: { 
            _id: {name: "$name"},
            uniqueIds: {$addToSet: "$_id"},
            count: {$sum: 1}
        } 
    },
    {$match: { 
        count: {"$gt": 1}
        }
    }
])

第一组根据字段查询组。

然后,我们检查唯一的Id并将其计数。如果count大于1,则该字段在整个集合中重复,以便由$ match查询处理。


1
我也无法使这一功能生效。不赞成投票!
Mathieu G

这篇文章很旧,但可能会有所帮助。检查一下,我将在本地检查它是否正常运行。就连我也碰到一个博客。请看一看。compose.com/articles/finding-duplicate-documents-in-mongodb
Aman shrivastava

我能够使它正常工作-已编辑以更新为已确认的工作版本。
AL Strine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.