MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue


No MongoDB, o $allElementsTrue operador de pipeline de agregação avalia uma matriz como um conjunto e retorna true se nenhum elemento na matriz for false .

Se a matriz contiver um elemento false , então $allElementsTrue retorna false .

O elemento de um array é true se não for false , null , 0 , ou undefined .

Exemplo


Suponha que temos uma coleção com o seguinte documento:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }

Este documento contém uma matriz.

Podemos executar a seguinte consulta com $allElementsTrue para descobrir se o array contém ou não um elemento que é false :
db.test.aggregate(
   [
     { $project: { 
        _id: 0,
        allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
         }
   ]
)

Resultado:
{ "allElementsTrue" : true }

Neste caso, nenhum dos elementos do array é false , e assim obtemos um resultado de true .

Quando o array contém false


Vamos adicionar o seguinte documento à coleção:
{ "_id" : 2, "data" : [ true, false ] }

E vamos executar $allElementsTrue contra esse documento:
db.test.aggregate(
  [
    { $match: { _id: 2 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultado:
{ "allElementsTrue" : false }

Desta vez temos false , mesmo que haja outro elemento que seja true . Isso é esperado, porque $allElementsTrue retorna false sempre que houver pelo menos um elemento false , independentemente de quantos outros elementos são verdadeiros.

Matrizes vazias


Arrays vazios retornam true .

Suponha que adicionamos o seguinte documento à nossa coleção:
{ "_id" : 3, "data" : [ ] }

Este documento contém uma matriz vazia.

Agora vamos executar $allElementsTrue novamente:
db.test.aggregate(
  [
    { $match: { _id: 3 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultado:
{ "allElementsTrue" : true }

Como esperado, ele retorna true .

Valores nulos, 0 e indefinidos


Não é totalmente verdade que $allElementsTrue avalia como false somente quando a matriz contém false .

O $allElementsTrue operador também avalia como false sempre que um array contém null , 0 , ou undefined valores.

Suponha que adicionamos os seguintes documentos à nossa coleção:
{ "_id" : 4, "data" : [ 1, null, 3 ] }
{ "_id" : 5, "data" : [ 1, undefined, 3 ] }
{ "_id" : 6, "data" : [ 0, 1, 2 ] }

A matriz de cada documento contém um elemento de null , 0 , ou undefined .

Agora vamos executar $allElementsTrue contra esses 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 os documentos retornam false como esperado.

Matrizes aninhadas


Se a matriz contiver uma matriz aninhada que contenha um elemento false , isso não é suficiente para $allElementsTrue para retornar false . Até $allElementsTrue está em causa, a matriz aninhada é o elemento e, portanto, não false .

Para demonstrar o que quero dizer, suponha que insiramos os seguintes documentos:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] }
{ "_id" : 8, "data" : [ 1, [ false ], false ] }

Agora vamos executar $allElementsTrue contra esses dois 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 o primeiro documento retornou true e o segundo retornou false .

Isso ocorre porque, no primeiro documento, o false value está aninhado dentro de outro array e, portanto, não conta como false valor (ou seja, o próprio array é o valor).

O segundo documento, no entanto, também contém false como um dos elementos da matriz e, portanto, esse valor é o que causa $allElementsTrue para avaliar como false .