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.