Saltar al contenido

Encuentra registros duplicados en MongoDB

Solución:

Usar agregación en name y obten name con count > 1:

db.collection.aggregate([
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
]);

Para ordenar los resultados de más a menos duplicados:

db.collection.aggregate([
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
]);

Para usar con otro nombre de columna que no sea “nombre”, cambie “$ nombre” para “$ nombre_columna

Puedes encontrar el list de duplicate nombres usando lo siguiente aggregate tubería:

  • Group todos los registros que tienen similares name.
  • Match aquellos groups tener registros mayores que 1.
  • Luego group de nuevo a project todos los nombres duplicados como un array.

El código:

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" ] }

La respuesta que dio anhic puede ser muy ineficaz si tiene una base de datos grande y el nombre del atributo está presente solo en algunos de los documentos.

Para mejorar la eficiencia, puede agregar $ match a la agregación.

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *