在MongoDB中查找重复logging

如何在mongo集合中find重复的字段?

我想检查是否有任何“名称”字段是重复的。

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

非常感谢!

name上使用聚合,并使用count > 1获取name

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

按照最重复的顺序对结果进行sorting:

 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 ”更改为“ $ column_name

您可以使用以下aggregatepipe道findduplicate名称的list

  • Group所有name相似的loggingGroup
  • Matchlogging大于1
  • 然后再次将所有重复名称作为array进行project

代码:

 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" ] } 

如果你有一个大的数据库,并且属性名只出现在一些文档中,anhic给出的答案可能是非常低效的。

为了提高效率,您可以为聚合添加一个$匹配。

 db.collection.aggregate( {"$match": {"name" :{ "$ne" : null } } }, {"$group" : {"_id": "$name", "count": { "$sum": 1 } } }, {"$match": {"count" : {"$gt": 1} } }, {"$project": {"name" : "$_id", "_id" : 0} } ) 
 db.collectionName.aggregate([ { $group:{ _id:{Name:"$name"}, uniqueId:{$addToSet:"$_id"}, count:{"$sum":1} } }, { $match:{ duplicate:{"$gt":1} } } ]); 

第一组根据字段查询组。

然后我们检查唯一的ID并计算它,如果count大于1,那么这个字段在整个集合中是重复的,所以事情是通过$ match查询来处理的。