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

MongoDB $ todos los elementos verdaderos

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 .