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 .