I MongoDB, $unionWith
aggregeringspipelinesteget utför en sammanslutning av två samlingar, och det inkluderar dubbletter.
Detta beter sig på liknande sätt som SQLs UNION ALL
, som även inkluderar dubbletter. Däremot använder du bara UNION
(dvs utan ALL
) i SQL tar bort dubbletter.
I MongoDB har vi inte möjlighet att ange $unionWith ALL
eller liknande, så vi måste minska dubbletter på annat sätt.
I MongoDB kan vi ta bort dubbletter genom att använda $group
skede.
Exempel
Anta att vi infogar följande dokument i två samlingar; en som heter cats
och en annan som heter 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 }
])
Och anta att vi kör följande fråga för att returnera alla namn från båda samlingarna:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
Resultat:
{ "name" :"Fluffig" }{ "name" :"Scratch" }{ "name" :"Mjau" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffig" }
Vi kan se att namnet Fluffy förekommer två gånger. Detta beror på att det finns två Fluffys i våra samlingar – en i cats
samling och en i dogs
samling.
Det här är bra om vi är glada över att ha dubbletter av värden. Men vad händer om vi inte gör det? Tänk om vi bara vill ha en lista med distinkta namn från båda samlingarna?
Det är där $group
scenen kommer in.
Vi kan lägga till $group
steg till name
fältet, så att det ser ut så här:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] )
Resultat:
{ "_id" :"Mjau" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffig" }Den här gången får vi bara 5 dokument istället för 6, och det finns bara en Fluffy.