Comment pourrais-je trouver des champs en double dans une collection de mongos?.
Je voudrais vérifier si l'un des champs "nom" sont des doublons.
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Merci beaucoup!
Utilisez l'agrégation sur name
et obtenez name
avec count > 1
:
db.collection.aggregate(
{"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)
Pour trier les résultats du plus au moins des doublons:
db.collection.aggregate(
{"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
{"$sort": {"count" : -1} },
{"$project": {"name" : "$_id", "_id" : 0} }
)
Pour utiliser un autre nom de colonne que "nom", remplacez "$ name" par "$ nom_colonne"
Vous pouvez trouver les noms list
de duplicate
à l'aide du pipeline aggregate
suivant:
Group
tous les enregistrements ayant le même name
.Match
ceux groups
ayant des enregistrements supérieurs à 1
.group
à nouveau à project
tous les doublons de noms en tant que array
.Le code:
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 réponse fournie par anhic peut s'avérer très inefficace si vous avez une base de données volumineuse et que le nom de l'attribut n'est présent que dans certains documents.
Pour améliorer l'efficacité, vous pouvez ajouter une correspondance $ à l'agrégation.
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)