I MongoDB, $anyElementTrue
aggregeringspipeline-operatör utvärderar en array som en uppsättning och returnerar true
om något av elementen är true
.
Om inget av elementen är true
, sedan returnerar den false
.
En arrays element är true
om det inte är false
, null
, 0
, eller undefined
.
Exempel
Anta att vi har en samling med följande dokument:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Detta dokument innehåller en array.
Vi kan köra följande fråga med $anyElementTrue
för att ta reda på om arrayen innehåller några element som utvärderas till true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : true }
I det här fallet utvärderas alla arrayelement till true
(dvs. de är inte false
, null
, 0
, eller undefined
), och så får vi resultatet av true
.
När inget element är sant
Låt oss lägga till följande dokument i samlingen:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Och låt oss köra $anyElementTrue
mot det dokumentet:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : false }
Som vi kan se här, $anyElementTrue
utvärderas till false
närhelst en array innehåller false
, null
, 0
, eller undefined
värden.
När arrayen innehåller både sant och falskt
Låt oss lägga till följande dokument i samlingen:
{ "_id" : 3, "data" : [ true, false ] }
Och låt oss köra $anyElementTrue
mot det dokumentet:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : true }
Vi får true
, även om det finns ett annat element som är false
. Detta är att vänta, eftersom $anyElementTrue
returnerar true
när det finns minst ett element som är true
, oavsett hur många andra element som är falska.
Tömma arrayer
Tomma arrayer returnerar true
.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 4, "data" : [ ] }
Detta dokument innehåller en tom array.
Låt oss nu köra $anyElementTrue
igen:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : false }
Den returnerar false
, eftersom en tom array inte är false
.
Inkapslade arrayer
$anyElementTrue
operatören inte gå ner i alla kapslade arrayer. Den utvärderar arrayen på toppnivå.
Därför, om den kapslade arrayen innehåller element som är true
eller false
är irrelevant för $anyElementTrue
. Så långt som $anyElementTrue
berörs är den kapslade arrayen elementet och därför true
.
För att visa vad jag menar, anta att vi infogar följande dokument:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Låt oss nu köra $anyElementTrue
mot dessa två dokument:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Vi kan se att det första dokumentet returnerade true
och den andra returnerade false
.
Detta beror på att arrayen i det första dokumentet innehåller en kapslad array, vilket är tillräckligt för att returnera true
, oavsett dess innehåll.
Det andra dokumentet innehåller inte en kapslad array – det innehåller bara två false
värden – och den utvärderas därför till false
.