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 .