In MongoDB, il $allElementsTrue
l'operatore della pipeline di aggregazione valuta un array come un set e restituisce true
se nessun elemento nell'array è false
.
Se l'array contiene un elemento che è false
, quindi $allElementsTrue
restituisce false
.
L'elemento di un array è true
se non è false
, null
, 0
o undefined
.
Esempio
Supponiamo di avere una collezione con il seguente documento:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Questo documento contiene un array.
Possiamo eseguire la seguente query con $allElementsTrue
per scoprire se l'array contiene o meno un elemento che è false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "allElementsTrue" : true }
In questo caso, nessuno degli elementi dell'array è false
, e quindi otteniamo un risultato di true
.
Quando l'array contiene false
Aggiungiamo alla raccolta il seguente documento:
{ "_id" : 2, "data" : [ true, false ] }
Ed eseguiamo $allElementsTrue
contro quel documento:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "allElementsTrue" : false }
Questa volta otteniamo false
, anche se c'è un altro elemento che è true
. Questo è prevedibile, perché $allElementsTrue
restituisce false
ogni volta che c'è almeno un elemento che è false
, indipendentemente da quanti altri elementi sono veri.
Matrici vuote
Gli array vuoti restituiscono true
.
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id" : 3, "data" : [ ] }
Questo documento contiene un array vuoto.
Ora eseguiamo $allElementsTrue
ancora:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "allElementsTrue" : true }
Come previsto, restituisce true
.
Valori nulli, 0 e non definiti
Non è del tutto vero che $allElementsTrue
restituisce false
solo quando l'array contiene false
.
Il $allElementsTrue
anche l'operatore restituisce false
ogni volta che un array contiene null
, 0
o undefined
valori.
Supponiamo di aggiungere i seguenti documenti alla nostra raccolta:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
L'array di ogni documento contiene un elemento di null
, 0
o undefined
.
Ora eseguiamo $allElementsTrue
contro quei documenti:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Tutti i documenti restituiscono false
come previsto.
Matrici nidificate
Se l'array contiene un array nidificato che contiene un elemento che è false
, allora non è sufficiente per $allElementsTrue
per restituire false
. Per quanto riguarda $allElementsTrue
è interessato, l'array nidificato è l'elemento, e quindi non false
.
Per dimostrare cosa intendo, supponiamo di inserire i seguenti documenti:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Ora eseguiamo $allElementsTrue
contro quei due documenti:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Possiamo vedere che il primo documento ha restituito true
e il secondo ha restituito false
.
Questo perché, nel primo documento, il false
value è nidificato all'interno di un altro array e quindi non conta come false
value (ovvero l'array stesso è il valore).
Il secondo documento, tuttavia, contiene anche false come uno degli elementi dell'array e, quindi, quel valore è ciò che causa $allElementsTrue
per restituire false
.