In MongoDB ist das $anyElementTrue
Der Aggregations-Pipeline-Operator wertet ein Array als Satz aus und gibt true
zurück wenn eines der Elemente true
ist .
Wenn keines der Elemente true
ist , dann gibt es false
zurück .
Das Element eines Arrays ist true
wenn es nicht false
ist , null
, 0
, oder undefined
.
Beispiel
Angenommen, wir haben eine Sammlung mit dem folgenden Dokument:
{ "_id" : 1, "data" : [ 1, 2, 3 ] }
Dieses Dokument enthält ein Array.
Wir können die folgende Abfrage mit $anyElementTrue
ausführen um herauszufinden, ob das Array Elemente enthält, die als true
ausgewertet werden :
db.test.aggregate(
[
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "anyElementTrue" : true }
In diesem Fall werden alle Array-Elemente als true
ausgewertet (d.h. sie sind nicht false
, null
, 0
, oder undefined
), und so erhalten wir als Ergebnis true
.
Wenn kein Element wahr ist
Lassen Sie uns das folgende Dokument zur Sammlung hinzufügen:
{ "_id" : 2, "data" : [ false, undefined, 0, null ] }
Und lassen Sie uns $anyElementTrue
ausführen gegen dieses Dokument:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "anyElementTrue" : false }
Wie wir hier sehen können, $anyElementTrue
wird zu false
ausgewertet immer wenn ein Array false
enthält , null
, 0
, oder undefined
Werte.
Wenn das Array sowohl True als auch False enthält
Lassen Sie uns das folgende Dokument zur Sammlung hinzufügen:
{ "_id" : 3, "data" : [ true, false ] }
Und lassen Sie uns $anyElementTrue
ausführen gegen dieses Dokument:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "anyElementTrue" : true }
Wir erhalten true
, obwohl es ein anderes Element gibt, das false
ist . Dies ist zu erwarten, da $anyElementTrue
gibt true
zurück immer wenn mindestens ein Element true
ist , unabhängig davon, wie viele andere Elemente falsch sind.
Leere Arrays
Leere Arrays geben true
zurück .
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 4, "data" : [ ] }
Dieses Dokument enthält ein leeres Array.
Lassen Sie uns nun $anyElementTrue
ausführen nochmal:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "anyElementTrue" : false }
Es gibt false
zurück , weil ein leeres Array nicht false
ist .
Verschachtelte Arrays
Der $anyElementTrue
Operator nicht Abstieg in alle verschachtelten Arrays. Es wertet das Array auf oberster Ebene aus.
Daher, ob das verschachtelte Array Elemente enthält, die true
sind oder false
ist für $anyElementTrue
irrelevant . Soweit $anyElementTrue
Das verschachtelte Array ist das Element und daher true
.
Um zu demonstrieren, was ich meine, nehmen wir an, wir fügen die folgenden Dokumente ein:
{ "_id" : 5, "data" : [ false, [ false ] ] } { "_id" : 6, "data" : [ false, false ] }
Lassen Sie uns nun $anyElementTrue
ausführen gegen diese beiden Dokumente:
db.test.aggregate(
[
{ $match: {_id: { $in: [5,6] }} },
{ $project: {
anyElementTrue: { $anyElementTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "_id" : 5, "anyElementTrue" : true } { "_id" : 6, "anyElementTrue" : false }
Wir können sehen, dass das erste Dokument true
zurückgegeben hat und der zweite gab false
zurück .
Dies liegt daran, dass das Array im ersten Dokument ein verschachteltes Array enthält, das ausreicht, um true
zurückzugeben , unabhängig von seinem Inhalt.
Das zweite Dokument enthält kein verschachteltes Array – es enthält nur zwei false
Werte – und wird daher zu false
ausgewertet .