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!

66
demandé sur Community 2014-11-18 03:55:17

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

121
répondu anhlc 2017-11-08 03:33:28

vous pouvez trouver le list de duplicate les noms en utilisant le aggregate pipeline suivant:

  • Group tous les enregistrements ayant le même name .
  • Match ceux groups dont les enregistrements sont supérieurs à 1 .
  • puis group à nouveau project tous les noms en double comme un 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" ] }
17
répondu BatScream 2014-11-18 01:13:36

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} }
)
3
répondu Juanín 2016-12-13 13:53:29
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.

-1
répondu Aman shrivastava 2016-05-24 06:38:33