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