sql >> Base de Datos >  >> NoSQL >> MongoDB

Encuentre todos los documentos duplicados en una colección MongoDB por un campo clave

La respuesta aceptada es terriblemente lenta en colecciones grandes y no devuelve el _id s de los registros duplicados.

La agregación es mucho más rápida y puede devolver el _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 }
]);

En la primera etapa de la canalización de agregación, $groupoperator agrega documentos por el name campo y tiendas en uniqueIds cada _id valor de los registros agrupados. El operador $sum suma los valores de los campos que se le pasan, en este caso la constante 1 - contando así el número de registros agrupados en el count campo.

En la segunda etapa de la canalización, usamos $match para filtrar documentos con un count de al menos 2, es decir, duplicados.

Luego, clasificamos primero los duplicados más frecuentes y limitamos los resultados a los 10 principales.

Esta consulta generará hasta $limit registros con nombres duplicados, junto con su _id s. Por ejemplo:

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