MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Намерете всички дублиращи се документи в колекция MongoDB по ключово поле

Приетият отговор е ужасно бавен при големи колекции и не връща _id s на дублираните записи.

Агрегацията е много по-бърза и може да върне _id s:

db.collection.aggregate([
  { $group: {
    _id: { name: "$name" },   // replace `name` here twice
    uniqueIds: { $addToSet: "$_id" },
    count: { $sum: 1 } 
  } }, 
  { $match: { 
    count: { $gte: 2 } 
  } },
  { $sort : { count : -1} },
  { $limit : 10 }
]);

В първия етап от конвейера за агрегиране, $groupoperator обобщава документи по name поле и съхранява в uniqueIds всеки _id стойност на групираните записи. Операторът $sum събира стойностите на предадените му полета, в този случай константата 1 - като по този начин броят на групираните записи в count поле.

Във втория етап от конвейера използваме $match за филтриране на документи с count от поне 2, т.е. дубликати.

След това първо сортираме най-често срещаните дубликати и ограничаваме резултатите до първите 10.

Тази заявка ще изведе до $limit записи с дублиращи се имена, заедно с техния _id с. Например:

{
  "_id" : {
    "name" : "Toothpick"
},
  "uniqueIds" : [
    "xzuzJd2qatfJCSvkN",
    "9bpewBsKbrGBQexv4",
    "fi3Gscg9M64BQdArv",
  ],
  "count" : 3
},
{
  "_id" : {
    "name" : "Broom"
  },
  "uniqueIds" : [
    "3vwny3YEj2qBsmmhA",
    "gJeWGcuX6Wk69oFYD"
  ],
  "count" : 2
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да наблюдавате вашите сървъри за бази данни с помощта на ClusterControl CLI

  2. Препратки към документ Mongoose с връзка „едно към много“.

  3. Model.find().toArray() твърди, че няма метод .toArray().

  4. Управление на множество технологии за бази данни с ClusterControl

  5. $unset е празен. Трябва да посочите поле така:{$unset:{<field>:...}}