sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $cualquierElementoVerdadero

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 .