In MongoDB die $unionWith
Aggregation-Pipeline-Stufe führt eine Vereinigung von zwei Sammlungen durch und schließt Duplikate ein.
Dies verhält sich ähnlich wie UNION ALL
von SQL , die auch Duplikate enthält. Verwenden Sie dagegen nur UNION
(also ohne den ALL
)in SQL entfernt Duplikate.
In MongoDB haben wir nicht die Möglichkeit, $unionWith ALL
anzugeben oder ähnliches, also müssen wir Duplikate auf andere Weise reduzieren.
In MongoDB können wir Duplikate mithilfe von $group
entfernen Bühne.
Beispiel
Angenommen, wir fügen die folgenden Dokumente in zwei Sammlungen ein; eine namens cats
und eine andere namens 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 }
])
Angenommen, wir führen die folgende Abfrage aus, um alle Namen aus beiden Sammlungen zurückzugeben:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
Ergebnis:
{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Miau" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffy" }
Wir können sehen, dass der Name Fluffy zweimal vorkommt. Das liegt daran, dass es zwei Fluffys in unseren Kollektionen gibt – eine in den cats
Sammlung und eine in den dogs
Sammlung.
Dies ist in Ordnung, wenn wir gerne doppelte Werte haben. Aber was, wenn wir es nicht tun? Was ist, wenn wir nur eine Liste unterschiedlicher Namen aus beiden Sammlungen wollen?
Dort befindet sich die $group
Stufe kommt herein.
Wir können die $group
hinzufügen Stufe zum name
Feld, sodass es so aussieht:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] )
Ergebnis:
{ "_id" :"Miau" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffy" }Dieses Mal bekommen wir nur 5 statt 6 Dokumente und es gibt nur einen Fluffy.