V MongoDB, $allElementsTrue
Operátor agregačního kanálu vyhodnotí pole jako množinu a vrátí true
pokud žádný prvek v poli není false
.
Pokud pole obsahuje prvek, který je false
a poté $allElementsTrue
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 pomocí $allElementsTrue
zjistit, zda pole obsahuje prvek, který je false
, či nikoli :
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "allElementsTrue" : true }
V tomto případě není žádný z prvků pole false
, a tak dostaneme výsledek true
.
Když pole obsahuje hodnotu False
Přidejme do sbírky následující dokument:
{ "_id" : 2, "data" : [ true, false ] }
A spustíme $allElementsTrue
proti tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "allElementsTrue" : false }
Tentokrát dostaneme false
, i když existuje další prvek, který je true
. To se dá očekávat, protože $allElementsTrue
vrátí false
vždy, když je alespoň jeden prvek false
bez ohledu na to, kolik dalších prvků je pravdivý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" : 3, "data" : [ ] }
Tento dokument obsahuje prázdné pole.
Nyní spustíme $allElementsTrue
znovu:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "allElementsTrue" : true }
Podle očekávání vrací true
.
Null, 0 a nedefinované hodnoty
Není tak úplně pravda, že $allElementsTrue
vyhodnotí jako false
pouze když pole obsahuje false
.
$allElementsTrue
operátor také vyhodnotí jako false
vždy, když pole obsahuje null
, 0
, nebo undefined
hodnoty.
Předpokládejme, že do naší sbírky přidáme následující dokumenty:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Pole každého dokumentu obsahuje prvek buď null
, 0
, nebo undefined
.
Nyní spustíme $allElementsTrue
proti těmto dokumentům:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Všechny dokumenty vrátí false
podle očekávání.
Vnořená pole
Pokud pole obsahuje vnořené pole, které obsahuje prvek, který je false
, pak to nestačí pro $allElementsTrue
vrátit false
. Až po $allElementsTrue
Pokud jde o to, vnořené pole je prvek, a proto ne false
.
Abychom demonstrovali, co tím myslím, předpokládejme, že vložíme následující dokumenty:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Nyní spustíme $allElementsTrue
proti těmto dvěma dokumentům:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Výsledek:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Vidíme, že první dokument vrátil true
a druhý vrátil false
.
Je to proto, že v prvním dokumentu je false
hodnota je vnořena do jiného pole, a proto se nepočítá jako false
value (tj. samotné pole je hodnotou).
Druhý dokument však také obsahuje false jako jeden z prvků pole, a proto tato hodnota způsobuje $allElementsTrue
vyhodnotit jako false
.