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 unname
similar. -
Match
losgroups
tienen registros mayores que1
. - Luego
group
vuelva agroup
paraproject
todos los nombres duplicados como unaarray
.
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.