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

MongoDB $setUnion

Di MongoDB, $setUnion operator pipa agregasi menerima dua atau lebih larik dan mengembalikan larik yang berisi elemen yang muncul di larik masukan mana pun.

$setUnion menerima dua atau lebih argumen, yang semuanya dapat berupa ekspresi valid apa pun selama masing-masing menyelesaikan ke array. $setUnion memperlakukan array sebagai set.

Contoh

Misalkan kita memiliki koleksi yang disebut data dengan dokumen sebagai berikut:

{ "_id" :1, "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :2, "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ] }{ "_id" :3, "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ] }{ "_id" :4, " a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ] }{ "_id" :5, "a" :[ 1, 2, 3 ], "b" :[ 4, 5 , 6 ] }

Kita dapat menerapkan $setUnion operator terhadap a dan b bidang dalam dokumen tersebut.

Contoh:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ], "hasil " :[ 1, 2, 3 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "hasil" :[ 1, 2, 3, 4, 5 ] }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "hasil" :[ 1, 2, 3, 4, 5, 6 ] }

Array Bersarang

$setUnion operator tidak turun ke array bersarang apa pun. Itu hanya mengevaluasi array tingkat atas.

Misalkan koleksi kita juga berisi dokumen-dokumen berikut:

{ "_id" :6, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :7, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ] }{ "_id" :8, "a" :[ [ 1, 2, 3 ] ] , "b" :[ [ 1, 2, 3 ] ] }{ "_id" :9, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ] }

Dan kami menerapkan $setUnion ke dua dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7, 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

{ "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ], "hasil" :[ 1, 2, 3, [ 1, 2, 3 ] ] } { "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ], "hasil" :[ 1, 2, 3, [ 1, 2 ] ] }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ], "hasil" :[ [ 1, 2, 3 ] ] }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ], "hasil" :[ 3, [ 1, 2 ], [ 1, 2, 3 ] }

Bidang Tidak Ada

Menerapkan $setUnion ke bidang yang tidak ada menghasilkan null .

Perhatikan dokumen berikut:

{ "_id" :10, "a" :[ 1, 2, 3 ] }{ "_id" :11, "b" :[ 1, 2, 3 ] }{ "_id" :12 } 

Dokumen pertama tidak memiliki b bidang, dokumen kedua tidak memiliki a bidang, dan dokumen ketiga tidak memiliki keduanya.

Inilah yang terjadi ketika kita menerapkan $setUnion ke a dan b bidang:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

{ "a" :[ 1, 2, 3 ], "hasil" :null }{ "b" :[ 1, 2, 3 ], "hasil" :null }{ "hasil" :null } 

Jenis Data Salah

Semua operan $setUnion harus berupa array. Jika tidak, kesalahan akan terjadi.

Misalkan koleksi kami berisi dokumen-dokumen berikut:

{ "_id" :13, "a" :[ 1, 2, 3 ], "b" :3 }{ "_id" :14, "a" :3, "b" :[ 1, 2, 3 ] }{ "_id" :15, "a" :2, "b" :3 }

Dan kami menerapkan $setUnion ke dokumen-dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 13, 14, 15 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"Semua operan $setUnion harus berupa array. Satu argumen bertipe:double", "code" :17043, "codeName" :"Location17043 "} :agregat gagal :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(kulit)::1:1

Nilai Duplikat

$setUnion operator menyaring duplikat dalam hasilnya untuk menampilkan larik yang hanya berisi entri unik. Juga, urutan elemen dalam larik keluaran tidak ditentukan.

Misalkan kita memiliki dokumen berikut:

{ "_id" :16, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :17, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 1, 2 ] }{ "_id" :18, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] }{ "_id" :19, "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ] }{ "_id" :20, "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ] }{ "_id" :21, "a" :[ 2, 3, 1, 2 , 3, 1 ], "b" :[ ] }

Kemudian kita terapkan $setUnion operator untuk mereka:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setUnion: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 1, 2 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 1, 2 , 2, 3, 3 ], "b" :[ ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], " hasil" :[ 1, 2, 3 ] }{ "a" :[ 2, 3, 1, 2, 3, 1 ], "b" :[ ], "hasil" :[ 1, 2, 3 ] } 

Lebih dari Dua Argumen

Seperti yang disebutkan, $setUnion menerima dua atau lebih argumen. Semua contoh sebelumnya menggunakan dua argumen. Ini salah satu yang menggunakan tiga argumen.

Misalkan kita memiliki dokumen berikut:

{ "_id" :22, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2 ] }{ "_id" :23, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2, 3 ] }{ "_id" :24, "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 4, 5 ] }

Dokumen-dokumen ini memiliki bidang tambahan – c lapangan.

Sekarang mari kita terapkan $setUnion ke tiga bidang itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 22, 23, 24 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            c: 1,
            result: { $setUnion: [ "$a", "$b", "$c" ] }
          }
     }
   ]
) 

Hasil:

{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2 ], "hasil" :[ 1, 2 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 1, 2, 3 ], "hasil" :[ 1, 2, 3 ] }{ "a" :[ 1, 2 ], "b" :[ 1, 2 ], "c" :[ 4, 5 ], "hasil" :[ 1, 2, 4, 5 ] }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana Anda memberi tahu Mongo untuk mengurutkan koleksi sebelum membatasi hasilnya?

  2. Apa yang Baru di MongoDB 4.4

  3. Tidak dapat menggunakan perintah mongo, menunjukkan perintah tidak ditemukan di mac

  4. Manakah GUI MongoDB Terbaik? — Pembaruan 2019

  5. show dbs memberikan Not Authorized untuk mengeksekusi perintah error