W MongoDB $allElementsTrue
Operator potoku agregacji ocenia tablicę jako zestaw i zwraca true
jeśli żaden element w tablicy nie jest false
.
Jeśli tablica zawiera element, który jest false
, a następnie $allElementsTrue
zwraca false
.
Element tablicy to true
jeśli to nie jest false
, null
, 0
lub undefined
.
Przykład
Załóżmy, że mamy kolekcję z następującym dokumentem:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Ten dokument zawiera tablicę.
Możemy uruchomić następujące zapytanie za pomocą $allElementsTrue
aby dowiedzieć się, czy tablica zawiera element, który jest false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "allElementsTrue" : true }
W tym przypadku żaden z elementów tablicy nie jest false
, więc otrzymujemy wynik true
.
Kiedy tablica zawiera fałsz
Dodajmy do kolekcji następujący dokument:
{ "_id" : 2, "data" : [ true, false ] }
I uruchommy $allElementsTrue
w stosunku do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "allElementsTrue" : false }
Tym razem otrzymujemy false
, mimo że istnieje inny element, który jest true
. Należy się tego spodziewać, ponieważ $allElementsTrue
zwraca false
gdy istnieje co najmniej jeden element, który jest false
, niezależnie od tego, ile innych elementów jest prawdziwych.
Puste tablice
Puste tablice zwracają true
.
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" : 3, "data" : [ ] }
Ten dokument zawiera pustą tablicę.
Teraz uruchommy $allElementsTrue
ponownie:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "allElementsTrue" : true }
Zgodnie z oczekiwaniami, zwraca true
.
Null, 0 i niezdefiniowane wartości
To nie do końca prawda, że $allElementsTrue
ocenia jako false
tylko gdy tablica zawiera false
.
$allElementsTrue
operator również zwraca się do false
gdy tablica zawiera null
, 0
lub undefined
wartości.
Załóżmy, że do naszej kolekcji dodamy następujące dokumenty:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Tablica każdego dokumentu zawiera element null
, 0
lub undefined
.
Teraz uruchommy $allElementsTrue
w stosunku do tych dokumentów:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Wszystkie dokumenty zwracają false
zgodnie z oczekiwaniami.
Zagnieżdżone tablice
Jeśli tablica zawiera zagnieżdżoną tablicę zawierającą element, który jest false
, to nie wystarczy dla $allElementsTrue
aby zwrócić false
. O ile $allElementsTrue
dotyczy, zagnieżdżona tablica jest elementem, a zatem nie false
.
Aby pokazać, o co mi chodzi, załóżmy, że wstawiamy następujące dokumenty:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Teraz uruchommy $allElementsTrue
przeciwko tym dwóm dokumentom:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Widzimy, że pierwszy dokument zwrócił true
a drugi zwrócił false
.
Dzieje się tak, ponieważ w pierwszym dokumencie false
wartość jest zagnieżdżona w innej tablicy i dlatego nie liczy się jako false
wartość (tj. sama tablica jest wartością).
Jednak drugi dokument zawiera również wartość false jako jeden z elementów tablicy, a zatem ta wartość powoduje $allElementsTrue
oceniać na false
.