I MongoDB er $anyElementTrue
aggregeringspipeline-operatør evaluerer et array som et sæt og returnerer true
hvis nogen af elementerne er true
.
Hvis ingen af elementerne er true
, så returnerer den 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 $anyElementTrue
for at finde ud af, om arrayet indeholder elementer, der evalueres til true
:
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : true }
I dette tilfælde evalueres alle array-elementer til true
(dvs. de er ikke false
, null
, 0
eller undefined
), og så får vi et resultat af true
.
Når intet element er sandt
Lad os tilføje følgende dokument til samlingen:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Og lad os køre $anyElementTrue
mod dette dokument:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : false }
Som vi kan se her, $anyElementTrue
evalueres til false
hver gang et array indeholder false
, null
, 0
eller undefined
værdier.
Når arrayet indeholder både sandt og falsk
Lad os tilføje følgende dokument til samlingen:
{ "_id" : 3, "data" : [ true, false ] }
Og lad os køre $anyElementTrue
mod dette dokument:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : true }
Vi får true
, selvom der er et andet element, der er false
. Dette kan forventes, fordi $anyElementTrue
returnerer true
når der er mindst ét element, der er true
, uanset hvor mange andre elementer der er falske.
Tomme arrays
Tomme arrays returnerer true
.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 4, "data" : [ ] }
Dette dokument indeholder et tomt array.
Lad os nu køre $anyElementTrue
igen:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "anyElementTrue" : false }
Det returnerer false
, fordi et tomt array ikke er false
.
Indlejrede arrays
$anyElementTrue
operatør ikke gå ned i alle indlejrede arrays. Den evaluerer arrayet på øverste niveau.
Derfor, om det indlejrede array indeholder elementer, der er true
eller false
er irrelevant for $anyElementTrue
. Så vidt $anyElementTrue
er bekymret, er det indlejrede array elementet og derfor true
.
For at demonstrere, hvad jeg mener, antag, at vi indsætter følgende dokumenter:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Lad os nu køre $anyElementTrue
mod disse to dokumenter:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Resultat:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Vi kan se, at det første dokument returnerede true
og den anden returnerede false
.
Dette skyldes, at arrayet i det første dokument indeholder en indlejret array, som er nok til at returnere true
, uanset indholdet.
Det andet dokument indeholder ikke et indlejret array - det indeholder kun to false
værdier – og den evalueres derfor til false
.