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 memilikia
bidang, dan dokumen ketiga tidak memiliki keduanya.Inilah yang terjadi ketika kita menerapkan
$setIsSubset
kea
danb
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:1Jenis 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:1Nilai 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 }