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
.