В MongoDB, $unionWith
Етапът на конвейера на агрегация извършва обединение на две колекции и включва дубликати.
Това се държи по подобен начин на UNION ALL
на SQL , което включва и дубликати. За разлика от това, използвайки само UNION
(т.е. без ALL
)в SQL премахва дубликатите.
В MongoDB нямаме опцията да посочим $unionWith ALL
или подобен, така че трябва да намалим дубликатите по друг начин.
В MongoDB можем да премахнем дубликати, като използваме $group
сцена.
Пример
Да предположим, че вмъкваме следните документи в две колекции; един, наречен cats
и друг, наречен 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 }
])
И да предположим, че изпълняваме следната заявка, за да върнем всички имена от двете колекции:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
Резултат:
{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Meow" }{ "name" :"Wag" }{ "name" :"Bark" }{ " име" :"Пухкав" }
Можем да видим, че името Fluffy се появява два пъти. Това е така, защото в нашите колекции има два Fluffys – единият в cats
колекция и един в dogs
колекция.
Това е добре, ако сме щастливи да имаме дублиращи се стойности. Но какво ще стане, ако не го направим? Ами ако искаме само списък с различни имена от двете колекции?
Това е мястото, където $group
етап идва.
Можем да добавим $group
етап до name
поле, така че да изглежда така:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] )
Резултат:
{ "_id" :"Мяу" }{ "_id" :"Ла" }{ "_id" :"Надраскване" }{ "_id" :"Размахване" }{ "_id" :"Пухкав" }предварително>Този път получаваме само 5 документа вместо 6 и има само един Fluffy.