Di MongoDB, $unionWith
tahap pipa agregasi melakukan penyatuan dua koleksi, dan itu termasuk duplikat.
Ini berperilaku dengan cara yang mirip dengan UNION ALL
SQL , yang juga mencakup duplikat. Sebaliknya, hanya menggunakan UNION
(yaitu tanpa ALL
)di SQL menghapus duplikat.
Di MongoDB, kami tidak memiliki opsi untuk menentukan $unionWith ALL
atau serupa, jadi kita perlu mengurangi duplikat dengan cara lain.
Di MongoDB, kita dapat menghapus duplikat dengan menggunakan $group
panggung.
Contoh
Misalkan kita memasukkan dokumen-dokumen berikut ke dalam dua koleksi; yang disebut cats
dan yang lain disebut 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 }
])
Dan misalkan kita menjalankan kueri berikut untuk mengembalikan semua nama dari kedua koleksi:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
Hasil:
{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Meow" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffy" }
Kita bisa melihat bahwa nama Fluffy muncul dua kali. Ini karena ada dua Fluffy dalam koleksi kami – satu di cats
koleksi dan satu di dogs
koleksi.
Ini bagus jika kami senang memiliki nilai duplikat. Tapi bagaimana jika kita tidak melakukannya? Bagaimana jika kita hanya menginginkan daftar nama yang berbeda dari kedua koleksi?
Di situlah $group
panggung masuk.
Kita dapat menambahkan $group
panggung ke name
kolom, sehingga terlihat seperti ini:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] )
Hasil:
{ "_id" :"Meow" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffy" }Kali ini kami hanya mendapatkan 5 dokumen, bukan 6, dan hanya ada satu Fluffy.