En MongoDB, el $anyElementTrue
el operador de canalización de agregación evalúa una matriz como un conjunto y devuelve true
si alguno de los elementos es true
.
Si ninguno de los elementos es true
, luego 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 $anyElementTrue
para averiguar si la matriz contiene o no elementos que se evalúen como true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "anyElementTrue" : true }
En este caso, todos los elementos de la matriz se evalúan como true
(es decir, no son false
, null
, 0
, o undefined
), por lo que obtenemos un resultado de true
.
Cuando ningún elemento es verdadero
Agreguemos el siguiente documento a la colección:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Y ejecutemos $anyElementTrue
contra ese documento:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "anyElementTrue" : false }
Como podemos ver aquí, $anyElementTrue
se evalúa como false
cada vez que una matriz contiene false
, null
, 0
, o undefined
valores.
Cuando la matriz contiene tanto verdadero como falso
Agreguemos el siguiente documento a la colección:
{ "_id" : 3, "data" : [ true, false ] }
Y ejecutemos $anyElementTrue
contra ese documento:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "anyElementTrue" : true }
Obtenemos true
, aunque hay otro elemento que es false
. Esto es de esperar, porque $anyElementTrue
devuelve true
siempre que haya al menos un elemento que sea true
, independientemente de cuántos otros elementos sean falsos.
Arreglos vacíos
Las matrices vacías devuelven true
.
Supongamos que agregamos el siguiente documento a nuestra colección:
{ "_id" : 4, "data" : [ ] }
Este documento contiene una matriz vacía.
Ahora ejecutemos $anyElementTrue
de nuevo:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "anyElementTrue" : false }
Devuelve false
, porque una matriz vacía no es false
.
Matrices anidadas
El $anyElementTrue
el operador no descender a cualquier matriz anidada. Evalúa la matriz en el nivel superior.
Por lo tanto, si la matriz anidada contiene elementos que son true
o false
es irrelevante para $anyElementTrue
. En cuanto a $anyElementTrue
se refiere, la matriz anidada es el elemento, y por lo tanto true
.
Para demostrar lo que quiero decir, supongamos que insertamos los siguientes documentos:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Ahora ejecutemos $anyElementTrue
contra esos dos documentos:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultado:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Podemos ver que el primer documento devolvió true
y el segundo devolvió false
.
Esto se debe a que la matriz en el primer documento contiene una matriz anidada, que es suficiente para devolver true
, independientemente de su contenido.
El segundo documento no contiene una matriz anidada, solo contiene dos false
valores – y por lo tanto se evalúa como false
.