W MongoDB $anyElementTrue
Operator potoku agregacji ocenia tablicę jako zestaw i zwraca true
jeśli którykolwiek z elementów jest true
.
Jeśli żaden z elementów nie jest true
, to 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ą $anyElementTrue
aby dowiedzieć się, czy tablica zawiera elementy, których wynikiem jest true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "anyElementTrue" : true }
W tym przypadku wszystkie elementy tablicy mają wartość true
(tzn. nie są false
, null
, 0
lub undefined
), a więc otrzymujemy wynik true
.
Kiedy żaden element nie jest prawdziwy
Dodajmy do kolekcji następujący dokument:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
I uruchommy $anyElementTrue
w stosunku do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "anyElementTrue" : false }
Jak widać tutaj, $anyElementTrue
ocenia jako false
gdy tablica zawiera false
, null
, 0
lub undefined
wartości.
Kiedy tablica zawiera zarówno prawdę, jak i fałsz
Dodajmy do kolekcji następujący dokument:
{ "_id" : 3, "data" : [ true, false ] }
I uruchommy $anyElementTrue
w stosunku do tego dokumentu:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "anyElementTrue" : true }
Otrzymujemy true
, mimo że istnieje inny element, który jest false
. Należy się tego spodziewać, ponieważ $anyElementTrue
zwraca true
gdy istnieje co najmniej jeden element, który jest true
, niezależnie od tego, ile innych elementów jest fałszywych.
Puste tablice
Puste tablice zwracają true
.
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" : 4, "data" : [ ] }
Ten dokument zawiera pustą tablicę.
Teraz uruchommy $anyElementTrue
ponownie:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "anyElementTrue" : false }
Zwraca false
, ponieważ pusta tablica nie jest false
.
Zagnieżdżone tablice
$anyElementTrue
operator nie zejść do dowolnych zagnieżdżonych tablic. Ocenia tablicę na najwyższym poziomie.
W związku z tym, czy zagnieżdżona tablica zawiera elementy, które są true
lub false
nie ma znaczenia dla $anyElementTrue
. O ile $anyElementTrue
dotyczy, zagnieżdżona tablica jest elementem, a zatem true
.
Aby pokazać, o co mi chodzi, załóżmy, że wstawiamy następujące dokumenty:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Teraz uruchommy $anyElementTrue
przeciwko tym dwóm dokumentom:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Wynik:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Widzimy, że pierwszy dokument zwrócił true
a drugi zwrócił false
.
Dzieje się tak, ponieważ tablica w pierwszym dokumencie zawiera zagnieżdżoną tablicę, która wystarcza do zwrócenia true
, niezależnie od jej zawartości.
Drugi dokument nie zawiera zagnieżdżonej tablicy – zawiera tylko dwa false
wartości – i dlatego otrzymuje wynik false
.