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 .