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 .