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
.