In MongoDB, il $anyElementTrue
l'operatore della pipeline di aggregazione valuta un array come un set e restituisce true
se uno qualsiasi degli elementi è true
.
Se nessuno degli elementi è true
, quindi 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 $anyElementTrue
per scoprire se l'array contiene o meno elementi che restituiscono true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "anyElementTrue" : true }
In questo caso, tutti gli elementi dell'array restituiscono true
(cioè non sono false
, null
, 0
o undefined
), e quindi otteniamo un risultato di true
.
Quando nessun elemento è vero
Aggiungiamo alla raccolta il seguente documento:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Ed eseguiamo $anyElementTrue
contro quel documento:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "anyElementTrue" : false }
Come possiamo vedere qui, $anyElementTrue
restituisce false
ogni volta che un array contiene false
, null
, 0
o undefined
valori.
Quando l'array contiene sia True che False
Aggiungiamo alla raccolta il seguente documento:
{ "_id" : 3, "data" : [ true, false ] }
Ed eseguiamo $anyElementTrue
contro quel documento:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "anyElementTrue" : true }
Otteniamo true
, anche se c'è un altro elemento che è false
. Questo è prevedibile, perché $anyElementTrue
restituisce true
ogni volta che c'è almeno un elemento che è true
, indipendentemente da quanti altri elementi sono falsi.
Matrici vuote
Gli array vuoti restituiscono true
.
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id" : 4, "data" : [ ] }
Questo documento contiene un array vuoto.
Ora eseguiamo $anyElementTrue
ancora:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "anyElementTrue" : false }
Restituisce false
, perché un array vuoto non è false
.
Matrici nidificate
Il $anyElementTrue
l'operatore non scendere in qualsiasi array nidificato. Valuta l'array al livello superiore.
Pertanto, se l'array nidificato contiene elementi che sono true
o false
è irrilevante per $anyElementTrue
. Per quanto riguarda $anyElementTrue
è interessato, l'array nidificato è l'elemento, e quindi true
.
Per dimostrare cosa intendo, supponiamo di inserire i seguenti documenti:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Ora eseguiamo $anyElementTrue
contro quei due documenti:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Risultato:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Possiamo vedere che il primo documento ha restituito true
e il secondo ha restituito false
.
Questo perché l'array nel primo documento contiene un array nidificato, che è sufficiente per restituire true
, indipendentemente dal suo contenuto.
Il secondo documento non contiene un array nidificato:contiene solo due false
valori – e quindi restituisce false
.