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 .