В MongoDB, $allElementsTrue
Операторът на конвейера за агрегиране оценява масив като набор и връща true
ако нито един елемент в масива не е false
.
Ако масивът съдържа елемент, който е false
, след това $allElementsTrue
връща false
.
Елементът на масива е true
ако не е false
, null
, 0
, или undefined
.
Пример
Да предположим, че имаме колекция със следния документ:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Този документ съдържа масив.
Можем да изпълним следната заявка с $allElementsTrue
за да разберете дали масивът съдържа или не елемент, който е false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Резултат:
{ "allElementsTrue" : true }
В този случай нито един от елементите на масива не е false
, и така получаваме резултат от true
.
Когато масивът съдържа False
Нека добавим следния документ към колекцията:
{ "_id" : 2, "data" : [ true, false ] }
И нека изпълним $allElementsTrue
срещу този документ:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Резултат:
{ "allElementsTrue" : false }
Този път получаваме false
, въпреки че има друг елемент, който е true
. Това може да се очаква, защото $allElementsTrue
връща false
винаги, когато има поне един елемент, който е false
, независимо колко други елемента са верни.
Празни масиви
Празните масиви връщат true
.
Да предположим, че добавяме следния документ към нашата колекция:
{ "_id" : 3, "data" : [ ] }
Този документ съдържа празен масив.
Сега нека изпълним $allElementsTrue
отново:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Резултат:
{ "allElementsTrue" : true }
Както се очаква, той връща true
.
Нулеви, 0 и недефинирани стойности
Не е напълно вярно, че $allElementsTrue
оценява на false
само когато масивът съдържа false
.
$allElementsTrue
операторът също се оценява на false
всеки път, когато масивът съдържа null
, 0
, или undefined
стойности.
Да предположим, че добавяме следните документи към нашата колекция:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Масивът на всеки документ съдържа елемент от null
, 0
, или undefined
.
Сега нека изпълним $allElementsTrue
срещу тези документи:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Резултат:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Всички документи връщат false
както се очаква.
Вложени масиви
Ако масивът съдържа вложен масив, който съдържа елемент, който е false
, то това не е достатъчно за $allElementsTrue
да върне false
. Що се отнася до $allElementsTrue
е загрижен, вложеният масив е елементът и следователно не false
.
За да демонстрирам какво имам предвид, да предположим, че вмъкваме следните документи:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Сега нека изпълним $allElementsTrue
срещу тези два документа:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Резултат:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Можем да видим, че първият документ върна true
а вторият върна false
.
Това е така, защото в първия документ false
стойността е вложена в друг масив и следователно не се брои като false
стойност (т.е. самият масив е стойността).
Вторият документ обаче също съдържа false като един от елементите на масива и следователно тази стойност е това, което причинява $allElementsTrue
за оценка на false
.