MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Supprimer les doublons lors de l'utilisation de $unionWith dans MongoDB

Dans MongoDB, le $unionWith l'étape de pipeline d'agrégation effectue une union de deux collections et inclut les doublons.

Cela se comporte de la même manière que UNION ALL de SQL , qui inclut également les doublons. En revanche, en utilisant uniquement UNION (c'est-à-dire sans le ALL ) en SQL supprime les doublons.

Dans MongoDB, nous n'avons pas la possibilité de spécifier $unionWith ALL ou similaire, nous devons donc réduire les doublons d'une autre manière.

Dans MongoDB, nous pouvons supprimer les doublons en utilisant le $group organiser.

Exemple

Supposons que nous insérions les documents suivants dans deux collections ; un appelé cats et un autre appelé dogs :

db.cats.insertMany([
    { _id: 1, name: "Fluffy", type: "Cat", weight: 5 },
    { _id: 2, name: "Scratch", type: "Cat", weight: 3 },
    { _id: 3, name: "Meow", type: "Cat", weight: 7 }
    ])

db.dogs.insertMany([
    { _id: 1, name: "Wag", type: "Dog", weight: 20 },
    { _id: 2, name: "Bark", type: "Dog", weight: 10 },
    { _id: 3, name: "Fluffy", type: "Dog", weight: 40 }
    ]) 

Et supposons que nous lancions la requête suivante pour renvoyer tous les noms des deux collections :

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] ) 

Résultat :

{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Meow" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffy" }

Nous pouvons voir que le nom Fluffy apparaît deux fois. C'est parce qu'il y a deux Fluffys dans nos collections - un dans les cats collection et une dans la collection dogs collecte.

C'est bien si nous sommes heureux d'avoir des valeurs en double. Et si nous ne le faisions pas ? Et si nous ne voulons qu'une liste de noms distincts des deux collections ?

C'est là que le $group la scène arrive.

Nous pouvons ajouter le $group étape vers le name champ, de sorte qu'il ressemble à ceci :

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
   { $group: { _id: "$name" } }
] ) 

Résultat :

{ "_id" :"Meow" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffy" } 

Cette fois, nous n'obtenons que 5 documents au lieu de 6, et il n'y a qu'un seul Fluffy.