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 .