web-dev-qa-db-fra.com

Trouver des enregistrements en double dans MongoDB

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!

84
Chris

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"

157
anhlc

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.
  • Puis 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" ] }
20
BatScream

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} }
)
7
Juanín