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 :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert. js:639:17example@sqldat.com/mongo/shell/assert.js:729:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/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 :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert. js:639:17example@sqldat.com/mongo/shell/assert.js:729:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/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 }