Найти дубликаты записей в MongoDB [дубликат]


этот вопрос уже есть ответ здесь:

  • MongoDB дублирует документы даже после добавления уникального ключа 2 ответы

Как бы я нашел повторяющиеся поля в коллекции mongo.

Я хотел бы проверить, являются ли какие-либо из полей "имя" дубликатами.

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

большое спасибо!

4 66

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.