En MongoDB, el $allElementsTrue
el operador de canalización de agregación evalúa una matriz como un conjunto y devuelve true
si ningún elemento en la matriz es false
.
Si la matriz contiene un elemento que es false
, luego $allElementsTrue
devuelve false
.
El elemento de una matriz es true
si no es false
, null
, 0
, o undefined
.
Ejemplo
Supongamos que tenemos una colección con el siguiente documento:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Este documento contiene una matriz.
Podemos ejecutar la siguiente consulta con $allElementsTrue
para averiguar si la matriz contiene o no un elemento que es false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "allElementsTrue" : true }
En este caso, ninguno de los elementos de la matriz es false
, por lo que obtenemos un resultado de true
.
Cuando la matriz contiene falso
Agreguemos el siguiente documento a la colección:
{ "_id" : 2, "data" : [ true, false ] }
Y ejecutemos $allElementsTrue
contra ese documento:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "allElementsTrue" : false }
Esta vez obtenemos false
, aunque hay otro elemento que es true
. Esto es de esperar, porque $allElementsTrue
devuelve false
siempre que haya al menos un elemento que sea false
, independientemente de cuántos otros elementos sean verdaderos.
Arreglos vacíos
Las matrices vacías devuelven true
.
Supongamos que agregamos el siguiente documento a nuestra colección:
{ "_id" : 3, "data" : [ ] }
Este documento contiene una matriz vacía.
Ahora ejecutemos $allElementsTrue
de nuevo:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "allElementsTrue" : true }
Como era de esperar, devuelve true
.
Valores nulos, 0 e indefinidos
No es del todo cierto que $allElementsTrue
se evalúa como false
solo cuando la matriz contiene false
.
$allElementsTrue
el operador también se evalúa como false
cada vez que una matriz contiene null
, 0
, o undefined
valores.
Supongamos que agregamos los siguientes documentos a nuestra colección:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
La matriz de cada documento contiene un elemento de null
, 0
, o undefined
.
Ahora ejecutemos $allElementsTrue
contra esos documentos:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Todos los documentos devuelven false
como se esperaba.
Matrices anidadas
Si la matriz contiene una matriz anidada que contiene un elemento que es false
, entonces eso no es suficiente para $allElementsTrue
para devolver false
. En cuanto a $allElementsTrue
se refiere, la matriz anidada es el elemento, y por lo tanto no false
.
Para demostrar lo que quiero decir, supongamos que insertamos los siguientes documentos:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Ahora ejecutemos $allElementsTrue
contra esos dos documentos:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Podemos ver que el primer documento devolvió true
y el segundo devolvió false
.
Esto se debe a que, en el primer documento, false
el valor está anidado dentro de otra matriz y, por lo tanto, no cuenta como false
valor (es decir, la matriz en sí es el valor).
Sin embargo, el segundo documento también contiene false como uno de los elementos de la matriz y, por lo tanto, ese valor es lo que causa $allElementsTrue
para evaluar a false
.