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 .