In MongoDB, de $allElementsTrue
aggregatiepijplijnoperator evalueert een array als een set en retourneert true
als geen enkel element in de array false
is .
Als de array een element bevat dat false
is , dan $allElementsTrue
retourneert false
.
Het element van een array is true
als het niet false
is , null
, 0
, of undefined
.
Voorbeeld
Stel dat we een verzameling hebben met het volgende document:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Dit document bevat een array.
We kunnen de volgende query uitvoeren met $allElementsTrue
om erachter te komen of de array al dan niet een element bevat dat false
is :
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "allElementsTrue" : true }
In dit geval is geen van de array-elementen false
, en dus krijgen we een resultaat van true
.
Als de array False bevat
Laten we het volgende document aan de collectie toevoegen:
{ "_id" : 2, "data" : [ true, false ] }
En laten we $allElementsTrue
. uitvoeren tegen dat document:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "allElementsTrue" : false }
Deze keer krijgen we false
, ook al is er een ander element dat true
is . Dit is te verwachten, omdat $allElementsTrue
retourneert false
wanneer er ten minste één element is dat false
. is , ongeacht hoeveel andere elementen waar zijn.
Lege arrays
Lege arrays retourneren true
.
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id" : 3, "data" : [ ] }
Dit document bevat een lege array.
Laten we nu $allElementsTrue
. uitvoeren nogmaals:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "allElementsTrue" : true }
Zoals verwacht, retourneert het true
.
Null-, 0- en ongedefinieerde waarden
Het is niet helemaal waar dat $allElementsTrue
evalueert tot false
alleen wanneer de array false
. bevat .
De $allElementsTrue
operator evalueert ook naar false
wanneer een array null
. bevat , 0
, of undefined
waarden.
Stel dat we de volgende documenten aan onze collectie toevoegen:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
De array van elk document bevat een element van ofwel null
, 0
, of undefined
.
Laten we nu $allElementsTrue
. uitvoeren tegen die documenten:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Alle documenten retourneren false
zoals verwacht.
Geneste arrays
Als de array een geneste array bevat die een element bevat dat false
is , dan is dat niet genoeg voor $allElementsTrue
om false
terug te geven . Voor zover $allElementsTrue
betreft, is de geneste array het element, en dus niet false
.
Laten we, om te demonstreren wat ik bedoel, de volgende documenten invoegen:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Laten we nu $allElementsTrue
. uitvoeren tegen die twee documenten:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
We kunnen zien dat het eerste document true
returned retourneerde en de tweede retourneerde false
.
Dit komt omdat in het eerste document de false
waarde is genest in een andere array en telt daarom niet als een false
waarde (d.w.z. de array zelf is de waarde).
Het tweede document bevat echter ook false als een van de array-elementen, en daarom is die waarde de oorzaak van $allElementsTrue
te evalueren tot false
.