I MongoDB, $allElementsTrue
aggregeringspipeline-operatör utvärderar en array som en uppsättning och returnerar true
om inget element i arrayen är false
.
Om arrayen innehåller ett element som är false
, sedan $allElementsTrue
returnerar 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 $allElementsTrue
för att ta reda på om arrayen innehåller ett element som är false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : true }
I det här fallet är inget av arrayelementen false
, och så får vi resultatet av true
.
När Arrayen innehåller False
Låt oss lägga till följande dokument i samlingen:
{ "_id" : 2, "data" : [ true, false ] }
Och låt oss köra $allElementsTrue
mot det dokumentet:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : false }
Den här gången får vi false
, även om det finns ett annat element som är true
. Detta är att vänta, eftersom $allElementsTrue
returnerar false
när det finns minst ett element som är false
, oavsett hur många andra element som är sanna.
Tömma arrayer
Tomma arrayer returnerar true
.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 3, "data" : [ ] }
Detta dokument innehåller en tom array.
Låt oss nu köra $allElementsTrue
igen:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : true }
Som förväntat returnerar den true
.
Null-, 0- och odefinierade värden
Det är inte helt sant att $allElementsTrue
utvärderas till false
endast när arrayen innehåller false
.
$allElementsTrue
operatorn utvärderar också till false
närhelst en array innehåller null
, 0
, eller undefined
värden.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Varje dokuments array innehåller ett element av antingen null
, 0
, eller undefined
.
Låt oss nu köra $allElementsTrue
mot dessa dokument:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Alla dokument returnerar false
som förväntat.
Inkapslade arrayer
Om arrayen innehåller en kapslad array som innehåller ett element som är false
, då räcker det inte för $allElementsTrue
för att returnera false
. Så långt som $allElementsTrue
berörs är den kapslade arrayen elementet och därför inte false
.
För att visa vad jag menar, anta att vi infogar följande dokument:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Låt oss nu köra $allElementsTrue
mot dessa två dokument:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Vi kan se att det första dokumentet returnerade true
och den andra returnerade false
.
Detta beror på att i det första dokumentet false
värde är kapslat inuti en annan array och räknas därför inte som en false
värde (dvs. själva arrayen är värdet).
Det andra dokumentet innehåller emellertid också false som ett av arrayelementen, och därför är det värdet det som orsakar $allElementsTrue
för att utvärdera till false
.