I MongoDB er $allElementsTrue
aggregeringspipeline-operatør evaluerer et array som et sæt og returnerer true
hvis intet element i arrayet er false
.
Hvis arrayet indeholder et element, der er false
, derefter $allElementsTrue
returnerer false
.
Et arrays element er true
hvis det ikke er false
, null
, 0
eller undefined
.
Eksempel
Antag, at vi har en samling med følgende dokument:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Dette dokument indeholder et array.
Vi kan køre følgende forespørgsel med $allElementsTrue
for at finde ud af, om arrayet indeholder et element, der er false
:
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : true }
I dette tilfælde er ingen af array-elementerne false
, og så får vi et resultat af true
.
Når arrayet indeholder falsk
Lad os tilføje følgende dokument til samlingen:
{ "_id" : 2, "data" : [ true, false ] }
Og lad os køre $allElementsTrue
mod dette dokument:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : false }
Denne gang får vi false
, selvom der er et andet element, der er true
. Dette kan forventes, fordi $allElementsTrue
returnerer false
når der er mindst ét element, der er false
, uanset hvor mange andre elementer der er sande.
Tomme arrays
Tomme arrays returnerer true
.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 3, "data" : [ ] }
Dette dokument indeholder et tomt array.
Lad os nu køre $allElementsTrue
igen:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "allElementsTrue" : true }
Som forventet returnerer den true
.
Nul-, 0- og udefinerede værdier
Det er ikke helt rigtigt, at $allElementsTrue
evalueres til false
kun når arrayet indeholder false
.
$allElementsTrue
operatør evaluerer også til false
hver gang et array indeholder null
, 0
eller undefined
værdier.
Antag, at vi føjer følgende dokumenter til vores samling:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Hvert dokuments array indeholder et element af enten null
, 0
eller undefined
.
Lad os nu køre $allElementsTrue
mod disse dokumenter:
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 }
Alle dokumenter returnerer false
som forventet.
Indlejrede arrays
Hvis arrayet indeholder et indlejret array, der indeholder et element, der er false
, så er det ikke nok til $allElementsTrue
for at returnere false
. Så vidt $allElementsTrue
er det indlejrede array elementet og derfor ikke false
.
For at demonstrere, hvad jeg mener, antag, at vi indsætter følgende dokumenter:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Lad os nu køre $allElementsTrue
mod disse to dokumenter:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Vi kan se, at det første dokument returnerede true
og den anden returnerede false
.
Dette er fordi, i det første dokument, false
værdi er indlejret i et andet array og tæller derfor ikke som en false
værdi (dvs. selve arrayet er værdien).
Det andet dokument indeholder imidlertid også false som et af array-elementerne, og derfor er denne værdi det, der forårsager $allElementsTrue
for at evaluere til false
.