V MongoDB, $anyElementTrue
Operátor agregačního kanálu vyhodnotí pole jako množinu a vrátí true
pokud je některý z prvků true
.
Pokud žádný z prvků není true
, pak vrátí false
.
Prvek pole je true
pokud to není false
, null
, 0
, nebo undefined
.
Příklad
Předpokládejme, že máme kolekci s následujícím dokumentem:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Tento dokument obsahuje pole.
Můžeme spustit následující dotaz s $anyElementTrue
zjistit, zda pole obsahuje nějaké prvky, které se vyhodnotí jako true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "anyElementTrue" : true }
V tomto případě se všechny prvky pole vyhodnotí jako true
(tj. nejsou false
, null
, 0
, nebo undefined
), a tak dostaneme výsledek true
.
Když žádný prvek není pravdivý
Přidejme do sbírky následující dokument:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
A spusťte $anyElementTrue
proti tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "anyElementTrue" : false }
Jak můžeme vidět zde, $anyElementTrue
vyhodnotí jako false
vždy, když pole obsahuje false
, null
, 0
, nebo undefined
hodnoty.
Když pole obsahuje True i False
Přidejme do sbírky následující dokument:
{ "_id" : 3, "data" : [ true, false ] }
A spusťte $anyElementTrue
proti tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "anyElementTrue" : true }
Dostaneme true
, i když je zde další prvek, který je false
. To se dá očekávat, protože $anyElementTrue
vrátí true
vždy, když existuje alespoň jeden prvek, který je true
bez ohledu na to, kolik dalších prvků je nepravdivých.
Prázdná pole
Prázdná pole vrátí true
.
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" : 4, "data" : [ ] }
Tento dokument obsahuje prázdné pole.
Nyní spustíme $anyElementTrue
znovu:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "anyElementTrue" : false }
Vrací false
, protože prázdné pole není false
.
Vnořená pole
$anyElementTrue
operátor není sestoupit do libovolných vnořených polí. Vyhodnocuje pole na nejvyšší úrovni.
Tedy zda vnořené pole obsahuje prvky, které jsou true
nebo false
je irelevantní pro $anyElementTrue
. Až po $anyElementTrue
je vnořené pole prvkem, a proto true
.
Abychom demonstrovali, co tím myslím, předpokládejme, že vložíme následující dokumenty:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Nyní spustíme $anyElementTrue
proti těmto dvěma dokumentům:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Vidíme, že první dokument vrátil true
a druhý vrátil false
.
Je to proto, že pole v prvním dokumentu obsahuje vnořené pole, které stačí k vrácení true
bez ohledu na jeho obsah.
Druhý dokument neobsahuje vnořené pole – obsahuje pouze dva false
hodnoty – a proto se vyhodnotí jako false
.