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 .