array mongodb aggregation-framework database

array - Encuentra registros duplicados en MongoDB



mongoose aggregate (4)

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 de "nombre" son duplicados.

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

¡Muchas gracias!


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 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} } )


Puede encontrar la list de nombres duplicate utilizando la siguiente canalización aggregate :

  • Group todos los registros que tengan un name similar.
  • Match los groups tienen registros mayores que 1 .
  • Luego group vuelva a group para project todos los nombres duplicados como una 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" ] }


Use aggregation en name y get 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 o 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 "nombre", cambie " $ name " por " $ column_name "


db.collectionName.aggregate([ { $group:{ _id:{Name:"$name"}, uniqueId:{$addToSet:"$_id"}, count:{"$sum":1} } }, { $match:{ duplicate:{"$gt":1} } } ]);

Primer grupo Consulta al grupo según los campos.

Luego, verificamos el identificador único y lo contamos. Si el recuento es mayor que 1, el campo se duplica en toda la colección, por lo que la consulta de $ match debe manejar esa cosa.