Найти дубликаты записей в MongoDB [дубликат]
этот вопрос уже есть ответ здесь:
- MongoDB дублирует документы даже после добавления уникального ключа 2 ответы
Как бы я нашел повторяющиеся поля в коллекции mongo.
Я хотел бы проверить, являются ли какие-либо из полей "имя" дубликатами.
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
большое спасибо!
4 ответа:
использовать агрегацию на
nameи вамnameСcount > 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" на " $column_name"
вы можете найти
listнаduplicateимена, используя следующие :
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" ] }
ответ anhic дал может быть очень неэффективным, если у вас есть большая база данных и имя атрибута присутствует только в некоторых документах.
для повышения эффективности вы можете добавить $match к агрегации.
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} } } ]);первая группа запрашивает группу в соответствии с полями.
затем мы проверяем уникальный идентификатор и подсчитываем его, если count больше 1, то поле дублируется во всей коллекции, так что вещь должна обрабатываться запросом $match.