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 memilikia
bidang, dan dokumen ketiga tidak memiliki keduanya.Inilah yang terjadi ketika kita menerapkan
$setEquals
kea
danb
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:1Seperti 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:1Nilai 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 mengembalikantrue
. Jika tidak, hasilnya akan menjadifalse
.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 }