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

MongoDB $setDifference

Di MongoDB, $setDifference operator pipa agregasi menerima dua set dan melakukan pelengkap relatif dari set kedua relatif terhadap yang pertama. Ini mengembalikan array yang berisi elemen yang hanya ada di set pertama.

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

Hasil:

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

Array Bersarang

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

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

Hasil:

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

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

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

Hasil:

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

Di dokumen pertama, a cocok dengan b persis, dan hasilnya adalah array kosong.

Di dokumen kedua, array bersarang di a berbeda dengan array bersarang di b , dan seluruh array bersarang dari a dikembalikan.

Bidang Tidak Ada

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

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

Hasil:

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

Jenis Data Salah

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

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

Hasil:

pengecualian yang tidak tertangkap:Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"kedua operan $setDifference harus berupa array. Argumen kedua bertipe:double", "code" :17049, "codeName" :"Location17049"} :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

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

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

Hasil:

{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ], "hasil" :[ ] }{ "a" :[ 1, 1 , 2, 2, 3, 3 ], "b" :[ 1, 2 ], "hasil" :[ 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" :[ ] }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], "hasil" :[ 3 ] }{ "a" :[ 2, 3 , 1, 2, 3, 1 ], "b" :[ ], "hasil" :[ 2, 3, 1 ] }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengurangi ukuran file database MongoDB

  2. Cara menginstal dan mengkonfigurasi MongoDB di Ubuntu

  3. Mongodb memasukkan dokumen tanpa bidang _id

  4. MongoDB $tambahkan

  5. Apakah kerangka Agregasi Mongodb lebih cepat dari peta/kurangi?