在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 ”
您可以使用以下aggregate
pipe道findduplicate
名称的list
:
-
Group
所有name
相似的loggingGroup
。 -
Match
logging大于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查询来处理的。