Di MongoDB, $mergeObjects operator pipa agregasi menggabungkan beberapa dokumen menjadi satu dokumen.
Sintaks
$mergeObjects operator mendukung dua sintaks.
Sintaks 1
{ $mergeObjects: [ <document1>, <document2>, ... ] } Sintaks 2:
{ $mergeObjects: <document> } Sintaks pertama menerima beberapa argumen dan sintaks kedua menerima satu argumen.
Contoh Sintaks 1 (Beberapa Argumen)
Sintaks pertama melibatkan penyediaan $mergeObjects dengan lebih dari satu argumen/dokumen. $mergeObjects lalu gabungkan dokumen-dokumen tersebut menjadi satu.
Misalkan kita memiliki koleksi yang disebut users dengan dokumen berikut:
{
"_id" : 1,
"name" : {
"f_name" : "Homer",
"l_name" : "Simpson"
},
"contact" : {
"email" : "example@sqldat.com",
"ph" : null
}
}
Kita dapat menggunakan $mergeObjects untuk menggabungkan name dan contact bidang:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
).pretty() Hasil:
{
"_id" : 1,
"user" : {
"f_name" : "Homer",
"l_name" : "Simpson",
"email" : "example@sqldat.com",
"ph" : null
}
}
Dalam hal ini, kami menggabungkan kedua bidang menjadi satu bidang yang disebut user . Jika kami memiliki lebih banyak bidang/dokumen, kami juga dapat menggabungkannya jika kami mau.
Nama Bidang Duplikat
Jika dokumen yang akan digabungkan berisi nama bidang duplikat, $mergeObjects menimpa bidang saat menggabungkan dokumen. Oleh karena itu, bidang dalam dokumen yang dihasilkan berisi nilai dari dokumen terakhir yang digabungkan untuk bidang tersebut.
Misalkan kita memiliki dokumen berikut:
{
"_id" : 2,
"name" : {
"f_name" : "Peter",
"l_name" : "Griffin"
},
"contact" : {
"email" : "example@sqldat.com",
"f_name" : "Bart"
}
}
Kita dapat melihat bahwa kedua dokumen berisi bidang bernama f_name .
Inilah yang terjadi ketika kami menggabungkan dokumen-dokumen itu:
db.users.aggregate(
[
{ $match: { _id: 2 } },
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
).pretty() Hasil:
{
"_id" : 2,
"user" : {
"f_name" : "Bart",
"l_name" : "Griffin",
"email" : "example@sqldat.com"
}
}
f_name bidang dalam dokumen yang dihasilkan berisi Bart , yang merupakan nilai dari dokumen terakhir yang digabungkan.
Nilai Null
Jika menggabungkan dokumen dengan null , dokumen yang dihasilkan akan dikembalikan tanpa perubahan apa pun.
Tetapi jika semua dokumen yang akan digabungkan adalah null , lalu dokumen kosong dikembalikan.
Misalkan kita memiliki dokumen berikut:
{
"_id" : 3,
"name" : {
"f_name" : "Hubert",
"l_name" : "Farnsworth"
},
"contact" : null
}
{ "_id" : 4, "name" : null, "contact" : null }
Inilah yang terjadi ketika kita menggabungkan name dan contact kolom dalam dua dokumen tersebut:
db.users.aggregate(
[
{ $match: { _id: { $in: [ 3, 4 ] } } },
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
) Hasil:
{ "_id" : 3, "user" : { "f_name" : "Hubert", "l_name" : "Farnsworth" } }
{ "_id" : 4, "user" : { } } Contoh Sintaks 2 (Argumen Tunggal)
Berikut adalah dua contoh yang menggunakan sintaks argumen tunggal.
$group Akumulator Panggung
Pada contoh pertama, $mergeObjects digunakan sebagai $group akumulator panggung.
Misalkan kita memiliki koleksi yang disebut products dengan dokumen sebagai berikut:
{
"_id" : 1,
"product" : "Shirt",
"inventory" : {
"blue" : 10,
"red" : 2
}
}
{
"_id" : 2,
"product" : "Shirt",
"inventory" : {
"green" : 3,
"black" : 1
}
}
{
"_id" : 3,
"product" : "Shorts",
"inventory" : {
"blue" : 2,
"red" : 8
}
}
{
"_id" : 4,
"product" : "Shorts",
"inventory" : {
"green" : 5,
"black" : 3
}
}
Kami dapat mengelompokkan dokumen-dokumen ini berdasarkan product mereka bidang, lalu gunakan $mergeObjects untuk menggabungkan inventory kolom untuk setiap grup:
db.products.aggregate( [
{ $group: {
_id: "$product",
mergedProducts: { $mergeObjects: "$inventory" }
}
}
]).pretty() Hasil:
{
"_id" : "Shorts",
"mergedProducts" : {
"blue" : 2,
"red" : 8,
"green" : 5,
"black" : 3
}
}
{
"_id" : "Shirt",
"mergedProducts" : {
"blue" : 10,
"red" : 2,
"green" : 3,
"black" : 1
}
} Array
Contoh ini berlaku $mergeObjects ke satu dokumen yang berisi bidang dengan larik dokumen.
Misalkan kita memiliki koleksi yang disebut test dengan dokumen sebagai berikut:
{
"_id" : 1,
"data" : [
{
"a" : 1,
"b" : 2
},
{
"c" : 3,
"d" : 4
}
]
}
Kita dapat menerapkan $mergeObjects ke data bidang:
db.test.aggregate(
[
{
$project:
{
result: { $mergeObjects: "$data" }
}
}
]
) Hasil:
{ "_id" : 1, "result" : { "a" : 1, "b" : 2, "c" : 3, "d" : 4 } } Bidang Tidak Ada
$mergeObjects mengabaikan bidang yang hilang. Artinya, jika Anda menyediakan bidang yang tidak ada, itu akan mengabaikannya. Jika tidak ada bidang yang ada, maka ia akan mengembalikan dokumen kosong.
Contoh:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$name", "$oops" ] }
}
}
]
).pretty() Hasil:
{ "_id" : 1, "user" : { "f_name" : "Homer", "l_name" : "Simpson" } }
{ "_id" : 2, "user" : { "f_name" : "Peter", "l_name" : "Griffin" } }
{ "_id" : 3, "user" : { "f_name" : "Hubert", "l_name" : "Farnsworth" } }
{ "_id" : 4, "user" : { } } Namun, inilah yang terjadi ketika tidak ada bidang yang ada:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$wrong", "$oops" ] }
}
}
]
).pretty() Hasil:
{ "_id" : 1, "user" : { } }
{ "_id" : 2, "user" : { } }
{ "_id" : 3, "user" : { } }
{ "_id" : 4, "user" : { } } Hasilnya adalah dokumen kosong.
Sama halnya ketika menggunakan sintaks argumen tunggal.
Contoh:
db.products.aggregate( [
{ $group: {
_id: "$product",
mergedProducts: { $mergeObjects: "$oops!" }
}
}
]).pretty() Hasil:
{ "_id" : "Shorts", "mergedProducts" : { } }
{ "_id" : "Shirt", "mergedProducts" : { } }