Buscar registros duplicados en MongoDB [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Cómo encontraría campos duplicados en una colección mongo.

Me gustaría comprobar si alguno de los "campos" nombre son duplicados.

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

Muchas gracias!

Author: Community, 2014-11-18

4 answers

Use la agregación en name y obtenga 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 por 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 "name", cambie " name name " a "{[10] }name column_name "

 121
Author: anhlc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-08 03:33:28

Puedes encontrar los list de duplicate nombres usando la siguiente tubería aggregate:

  • Group todos los registros que tienen similares name.
  • Match aquellos groups que tienen 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" ] }
 17
Author: BatScream,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 01:13:36

La respuesta que dio anhic puede ser muy ineficiente 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 un match 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} }
)
 3
Author: Juanín,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 13:53:29
db.collectionName.aggregate([
{ $group:{
    _id:{Name:"$name"},
    uniqueId:{$addToSet:"$_id"},
    count:{"$sum":1}
  } 
},
{ $match:{
  duplicate:{"$gt":1}
 }
}
]);

Primer Grupo Consulta el grupo según los campos.

Luego verificamos el Id único y lo contamos, Si count es mayor que 1, entonces el campo está duplicado en toda la colección, por lo que esa cosa debe manejarse mediante query match query.

 -1
Author: Aman shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 06:38:33