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

MongoDB $setEquals

Di MongoDB, $setEquals operator pipeline agregasi membandingkan dua atau beberapa larik dan menampilkan true jika mereka memiliki elemen berbeda yang sama dan false sebaliknya.

$setEquals menerima dua argumen atau lebih, yang semuanya dapat berupa ekspresi apa pun yang valid selama masing-masing diselesaikan ke array. $setEquals 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 $setEquals 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: { $setEquals: [ "$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" :salah }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "hasil" :salah }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "hasil " :salah }

Array Bersarang

$setEquals 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 $setEquals ke dua dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$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, larik luar dievaluasi, dan ternyata tidak mengandung nilai yang sama dengan larik di a .

Namun, jika a field telah berisi array bersarang itu sendiri, itu mungkin cerita yang berbeda.

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

Dan kami menerapkan $setEquals ke dokumen-dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$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, array bersarang di a berbeda dengan array bersarang di b , dan kita mendapatkan false .

Bidang Tidak Ada

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

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

Hasil:

Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"Semua operan $setEquals harus berupa array. Satu argumen bertipe:missing", "code" :17044, "codeName" :"Location17044 "} :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

Seperti yang dinyatakan oleh pesan, semua operan harus berupa array. Argumen/bidang yang hilang bukanlah larik.

Jenis Data Salah

Seperti yang terlihat pada contoh sebelumnya, semua operan $setEquals harus berupa array. Jika bidang yang mereka rujuk tidak ada, kesalahan akan muncul. Kesalahan yang sama terjadi ketika operan tidak hilang, tetapi hanya jenis yang salah.

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 $setEquals ke dokumen-dokumen itu:

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

Hasil:

Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"Semua operan $setEquals harus berupa array. Satu argumen bertipe:double", "code" :17044, "codeName" :"Location17044 "} :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

$setEquals operator mengabaikan entri 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 $setEquals operator untuk mereka:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$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 }

Lebih dari Dua Argumen

Seperti yang disebutkan, $setEquals menerima dua atau lebih argumen. Dalam semua kasus, argumen harus memiliki nilai berbeda yang sama untuk mengembalikan true . Jika tidak, hasilnya akan menjadi false .

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

Dokumen-dokumen ini memiliki bidang tambahan – c lapangan.

Sekarang mari kita terapkan $setEquals ke tiga bidang itu:

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

Hasil:

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Integrasi &Layanan Tersedia dari MongoDB untuk Cloud

  2. Nilai mutlak dengan kerangka agregasi MongoDB

  3. Tidak dapat terhubung ke mongodb menggunakan ip mesin

  4. gagal dengan kesalahan 10068:operator tidak valid:$oid

  5. 2 Cara Menghapus Database di MongoDB