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 .