MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $mergeObjects

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" : "[email protected]",
		"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" : "[email protected]",
		"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" : "[email protected]",
		"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" : "[email protected]"
	}
}

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" : { } }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Buat bidang peningkatan otomatis yang unik dengan luwak

  2. Memesan hasil yang ditetapkan secara acak di mongo

  3. Membuat area admin dalam lima menit dengan AdminBro, express, mongoDB, luwak

  4. Cara menghasilkan id objek unik di mongodb

  5. Apa cara yang tepat untuk membuat kueri MongoDB sinkron di Node.js?