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

MongoDB $anyElementTrue


No MongoDB, o $anyElementTrue operador de pipeline de agregação avalia uma matriz como um conjunto e retorna true se algum dos elementos for true .

Se nenhum dos elementos for true , então ele 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 $anyElementTrue para descobrir se o array contém ou não algum elemento avaliado como true :
db.test.aggregate(
   [
     { $project: { 
        _id: 0,
        anyElementTrue: { $anyElementTrue: [ "$data" ] } } 
         }
   ]
)

Resultado:
{ "anyElementTrue" : true }

Nesse caso, todos os elementos do array são avaliados como true (ou seja, eles não são false , null , 0 , ou undefined ), e assim obtemos um resultado de true .

Quando nenhum elemento é verdadeiro


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

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

Resultado:
{ "anyElementTrue" : false }

Como podemos ver aqui, $anyElementTrue avalia como false sempre que um array contém false , null , 0 , ou undefined valores.

Quando a matriz contém True e False


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

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

Resultado:
{ "anyElementTrue" : true }

Obtemos true , mesmo que haja outro elemento false . Isso é esperado, porque $anyElementTrue retorna true sempre que houver pelo menos um elemento true , independentemente de quantos outros elementos são falsos.

Matrizes vazias


Arrays vazios retornam true .

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

Este documento contém uma matriz vazia.

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

Resultado:
{ "anyElementTrue" : false }

Ele retorna false , porque uma matriz vazia não é false .

Matrizes aninhadas


O $anyElementTrue operador não descer em quaisquer matrizes aninhadas. Ele avalia a matriz no nível superior.

Portanto, se a matriz aninhada contém elementos que são true ou false é irrelevante para $anyElementTrue . Até $anyElementTrue está em causa, a matriz aninhada é o elemento e, portanto, true .

Para demonstrar o que quero dizer, suponha que insiramos os seguintes documentos:
{ "_id" : 5, "data" : [ false, [ false ] ] }
{ "_id" : 6, "data" : [ false, false ] }

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

Isso ocorre porque, a matriz no primeiro documento contém uma matriz aninhada, que é suficiente para retornar true , independentemente do seu conteúdo.

O segundo documento não contém uma matriz aninhada – contém apenas dois false valores - e, portanto, avalia como false .