Trouver des enregistrements en double en MongoDB [dupliquer]
cette question a déjà une réponse ici:
- MongoDB Documents en Double, même après l'ajout de la clé unique de 2 réponses
Comment pourrais-je trouver des champs dupliqués dans une collection mongo.
j'aimerais vérifier si les champs" Nom " sont des doublons.
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Merci beaucoup!
4 réponses
utiliser l'agrégation sur name
et obtenir 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 par les doublons les plus ou les moins:
db.collection.aggregate(
{"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
{"$sort": {"count" : -1} },
{"$project": {"name" : "$_id", "_id" : 0} }
)
à utiliser avec un autre nom de colonne que "nom", remplacer " $name " par " $ column_name
vous pouvez trouver le list
de duplicate
les noms en utilisant le aggregate
pipeline suivant:
-
Group
tous les enregistrements ayant le mêmename
. -
Match
ceuxgroups
dont les enregistrements sont supérieurs à1
. - puis
group
à nouveauproject
tous les noms en double comme unarray
.
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 donnée par anhic peut être très inefficace si vous avez une grande base de données et que le nom de l'attribut n'est présent que dans certains documents.
Pour améliorer l'efficacité, vous pouvez ajouter un $correspond à 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} }
)
db.collectionName.aggregate([
{ $group:{
_id:{Name:"$name"},
uniqueId:{$addToSet:"$_id"},
count:{"$sum":1}
}
},
{ $match:{
duplicate:{"$gt":1}
}
}
]);
premier groupe interrogez le groupe selon les champs.
ensuite, nous vérifions l'Id unique et le comptons, si le nombre est supérieur à 1, alors le champ est dupliqué dans toute la collection de sorte que cette chose doit être traitée par $match query.