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
}