Di MongoDB, $allElementsTrue
operator pipa agregasi mengevaluasi array sebagai satu set dan mengembalikan true
jika tidak ada elemen dalam array yang false
.
Jika array berisi elemen yang false
, lalu $allElementsTrue
mengembalikan false
.
Elemen array adalah true
jika tidak false
, null
, 0
, atau undefined
.
Contoh
Misalkan kita memiliki koleksi dengan dokumen berikut:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Dokumen ini berisi larik.
Kita dapat menjalankan kueri berikut dengan $allElementsTrue
untuk mengetahui apakah array mengandung elemen yang false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Hasil:
{ "allElementsTrue" : true }
Dalam hal ini, tidak ada elemen array yang false
, dan jadi kami mendapatkan hasil dari true
.
Bila Array Berisi Salah
Mari tambahkan dokumen berikut ke koleksi:
{ "_id" : 2, "data" : [ true, false ] }
Dan mari kita jalankan $allElementsTrue
terhadap dokumen itu:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Hasil:
{ "allElementsTrue" : false }
Kali ini kita mendapatkan false
, meskipun ada elemen lain yang true
. Ini sudah diduga, karena $allElementsTrue
mengembalikan false
setiap kali ada setidaknya satu elemen yang false
, terlepas dari berapa banyak elemen lain yang benar.
Array Kosong
Array kosong mengembalikan true
.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 3, "data" : [ ] }
Dokumen ini berisi larik kosong.
Sekarang mari kita jalankan $allElementsTrue
lagi:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Hasil:
{ "allElementsTrue" : true }
Seperti yang diharapkan, ia mengembalikan true
.
Nilai Null, 0, dan Undefined
Tidak sepenuhnya benar bahwa $allElementsTrue
dievaluasi menjadi false
hanya ketika array berisi false
.
$allElementsTrue
operator juga mengevaluasi ke false
setiap kali array berisi null
, 0
, atau undefined
nilai.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Setiap larik dokumen berisi elemen null
, 0
, atau undefined
.
Sekarang mari kita jalankan $allElementsTrue
terhadap dokumen-dokumen itu:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Hasil:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Semua dokumen mengembalikan false
seperti yang diharapkan.
Array Bersarang
Jika larik berisi larik bersarang yang berisi elemen yang false
, maka itu tidak cukup untuk $allElementsTrue
untuk mengembalikan false
. Sejauh $allElementsTrue
yang bersangkutan, array bersarang adalah elemennya, dan oleh karena itu bukan false
.
Untuk mendemonstrasikan apa yang saya maksud, misalkan kita memasukkan dokumen berikut:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Sekarang mari kita jalankan $allElementsTrue
terhadap dua dokumen tersebut:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Hasil:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Kita dapat melihat bahwa dokumen pertama mengembalikan true
dan yang kedua mengembalikan false
.
Ini karena, pada dokumen pertama, kode false
nilai bersarang di dalam larik lain, dan karena itu tidak dihitung sebagai false
nilai (yaitu array itu sendiri adalah nilai).
Namun dokumen kedua, juga berisi false sebagai salah satu elemen array, dan oleh karena itu, nilai itulah yang menyebabkan $allElementsTrue
untuk mengevaluasi ke false
.