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 .