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

MongoDB $setIsSubset

Di MongoDB, $setIsSubset operator pipa agregasi menerima dua larik dan mengembalikan true ketika larik pertama adalah subset dari larik kedua, dan false ketika tidak.

Array pertama juga dianggap sebagai subset jika sama dengan array kedua.

$setIsSubset menerima dua argumen, keduanya dapat berupa ekspresi valid apa pun selama masing-masing menyelesaikan ke array. $setIsSubset 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 $setIsSubset 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: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Hasil:

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

Array Bersarang

$setIsSubset 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 ] }

Dan kami menerapkan $setIsSubset ke dua dokumen itu:

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

Hasil:

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

Pada dokumen pertama, b field berisi array yang hanya berisi satu elemen – array lain. Dalam hal ini ditemukan bahwa a bukan bagian dari b .

Namun, misalkan kita memiliki dokumen berikut:

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

Dokumen 8 berisi array bersarang di kedua a dan b bidang, dan kedua lariknya identik.

Inilah yang terjadi ketika kita menerapkan $setIsSubset ke dokumen-dokumen itu:

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

Hasil:

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

Di dokumen pertama, a cocok dengan b tepat, dan hasilnya adalah true .

Di dokumen kedua, a bukan bagian dari b , dan hasilnya adalah false .

Bidang Tidak Ada

Menerapkan $setIsSubset ke bidang yang tidak ada menghasilkan kesalahan.

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 $setIsSubset ke a dan b bidang:

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

Hasil:

Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"kedua operan $setIsSubset harus berupa array. Argumen kedua bertipe:missing", "code" :17042, "codeName" :"Location17042 "} :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

Jenis Data Salah

Kedua operan $setIsSubset 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 $setIsSubset ke dokumen-dokumen itu:

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

Hasil:

Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"kedua operan $setIsSubset harus berupa array. Argumen kedua bertipe:double", "code" :17042, "codeName" :"Location17042 "} :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

$setIsSubset operator mengabaikan duplikat. Itu juga mengabaikan urutan elemen..

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, 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 menerapkan $setIsSubset operator untuk mereka:

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

Hasil:

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kesalahan MongoDB:Tidak dapat menggunakan penulisan yang dapat dicoba lagi dengan batas =0

  2. Pengelompokan bersyarat dengan $ada di dalam $cond

  3. Faktor yang Perlu Dipertimbangkan Saat Memilih MongoDB untuk Aplikasi Big Data

  4. 4 Cara Menghapus Dokumen di MongoDB

  5. Impor Data ke Instans MongoDB yang Baru Anda Buat