In MongoDB is de $anyElementTrue
aggregatiepijplijnoperator evalueert een array als een set en retourneert true
als een van de elementen true
is .
Als geen van de elementen true
is , dan retourneert het 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 $anyElementTrue
om erachter te komen of de array al dan niet elementen bevat die als true
worden geëvalueerd :
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "anyElementTrue" : true }
In dit geval evalueren alle array-elementen naar true
(d.w.z. ze zijn niet false
, null
, 0
, of undefined
), en dus krijgen we een resultaat van true
.
Als geen enkel element waar is
Laten we het volgende document aan de collectie toevoegen:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
En laten we $anyElementTrue
. uitvoeren tegen dat document:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "anyElementTrue" : false }
Zoals we hier kunnen zien, $anyElementTrue
evalueert tot false
wanneer een array false
. bevat , null
, 0
, of undefined
waarden.
Als de array zowel waar als onwaar bevat
Laten we het volgende document aan de collectie toevoegen:
{ "_id" : 3, "data" : [ true, false ] }
En laten we $anyElementTrue
. uitvoeren tegen dat document:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "anyElementTrue" : true }
We krijgen true
, ook al is er een ander element dat false
is . Dit is te verwachten, omdat $anyElementTrue
retourneert true
wanneer er ten minste één element is dat true
is , ongeacht hoeveel andere elementen onwaar zijn.
Lege arrays
Lege arrays retourneren true
.
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id" : 4, "data" : [ ] }
Dit document bevat een lege array.
Laten we nu $anyElementTrue
. uitvoeren nogmaals:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "anyElementTrue" : false }
Het retourneert false
, omdat een lege array niet false
is .
Geneste arrays
De $anyElementTrue
operator doet niet afdalen in alle geneste arrays. Het evalueert de array op het hoogste niveau.
Dus of de geneste array elementen bevat die true
zijn? of false
is niet relevant voor $anyElementTrue
. Voor zover $anyElementTrue
betreft, is de geneste array het element, en daarom true
.
Laten we, om te demonstreren wat ik bedoel, de volgende documenten invoegen:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Laten we nu $anyElementTrue
. uitvoeren tegen die twee documenten:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultaat:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
We kunnen zien dat het eerste document true
returned retourneerde en de tweede retourneerde false
.
Dit komt omdat de array in het eerste document een geneste array bevat, wat voldoende is om true
te retourneren , ongeacht de inhoud ervan.
Het tweede document bevat geen geneste array - het bevat slechts twee false
waarden – en daarom evalueert het naar false
.