Найти дубликаты записей в 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.