Найти дубликаты записей в MongoDB
Как найти дубликаты полей в коллекции mongo.
Я хотел бы проверить, являются ли какие-либо поля "name" дублирующими.
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Большое спасибо!
Ответы
Ответ 1
Используйте агрегацию на 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"
Ответ 2
Вы можете найти имена list
duplicate
, используя следующий 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}}
])
о/р
{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }
Ответ 3
Ответ anhic дал очень неэффективно, если у вас большая база данных, а имя атрибута присутствует только в некоторых документах.
Чтобы повысить эффективность, вы можете добавить $match к агрегации.
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)
Ответ 4
db.collectionName.aggregate([
{ $group:{
_id:{Name:"$name"},
uniqueId:{$addToSet:"$_id"},
count:{"$sum":1}
}
},
{ $match:{
duplicate:{"$gt":1}
}
}
]);
Первая группа. Запросите группу в соответствии с полями.
Затем мы проверяем уникальный идентификатор и подсчитываем его, если счетчик больше 1, тогда поле дублируется во всей коллекции, так что вещь должна обрабатываться запросом $match.