In MongoDB ist der $allElementsTrue
Der Aggregations-Pipeline-Operator wertet ein Array als Satz aus und gibt true
zurück wenn kein Element im Array false
ist .
Wenn das Array ein Element enthält, das false
ist , dann $allElementsTrue
gibt 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 $allElementsTrue
ausführen um herauszufinden, ob das Array ein Element enthält, das false
ist :
db.test.aggregate(
[
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "allElementsTrue" : true }
In diesem Fall ist keines der Array-Elemente false
, und so erhalten wir als Ergebnis true
.
Wenn das Array False enthält
Lassen Sie uns das folgende Dokument zur Sammlung hinzufügen:
{ "_id" : 2, "data" : [ true, false ] }
Und lassen Sie uns $allElementsTrue
ausführen gegen dieses Dokument:
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "allElementsTrue" : false }
Diesmal erhalten wir false
, obwohl es ein anderes Element gibt, das true
ist . Dies ist zu erwarten, da $allElementsTrue
gibt false
zurück immer wenn mindestens ein Element false
ist , unabhängig davon, wie viele andere Elemente wahr sind.
Leere Arrays
Leere Arrays geben true
zurück .
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 3, "data" : [ ] }
Dieses Dokument enthält ein leeres Array.
Lassen Sie uns nun $allElementsTrue
ausführen nochmal:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "allElementsTrue" : true }
Wie erwartet gibt es true
zurück .
Null, 0 und undefinierte Werte
Es ist nicht ganz richtig, dass $allElementsTrue
wird zu false
ausgewertet nur wenn das Array false
enthält .
Der $allElementsTrue
-Operator wird auch zu false
ausgewertet immer wenn ein Array null
enthält , 0
, oder undefined
Werte.
Angenommen, wir fügen unserer Sammlung die folgenden Dokumente hinzu:
{ "_id" : 4, "data" : [ 1, null, 3 ] } { "_id" : 5, "data" : [ 1, undefined, 3 ] } { "_id" : 6, "data" : [ 0, 1, 2 ] }
Das Array jedes Dokuments enthält ein Element von entweder null
, 0
, oder undefined
.
Lassen Sie uns nun $allElementsTrue
ausführen gegen diese Dokumente:
db.test.aggregate(
[
{ $match: {_id: { $in: [4,5,6] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "_id" : 4, "allElementsTrue" : false } { "_id" : 5, "allElementsTrue" : false } { "_id" : 6, "allElementsTrue" : false }
Alle Dokumente geben false
zurück wie erwartet.
Verschachtelte Arrays
Wenn das Array ein verschachteltes Array enthält, das ein Element enthält, das false
ist , dann reicht das nicht für $allElementsTrue
um false
zurückzugeben . Soweit $allElementsTrue
Das verschachtelte Array ist das Element und daher nicht false
.
Um zu demonstrieren, was ich meine, nehmen wir an, wir fügen die folgenden Dokumente ein:
{ "_id" : 7, "data" : [ 1, [ false ], 3 ] } { "_id" : 8, "data" : [ 1, [ false ], false ] }
Lassen Sie uns nun $allElementsTrue
ausführen gegen diese beiden Dokumente:
db.test.aggregate(
[
{ $match: {_id: { $in: [7,8] }} },
{ $project: {
allElementsTrue: { $allElementsTrue: [ "$data" ] } }
}
]
)
Ergebnis:
{ "_id" : 7, "allElementsTrue" : true } { "_id" : 8, "allElementsTrue" : false }
Wir können sehen, dass das erste Dokument true
zurückgegeben hat und der zweite gab false
zurück .
Das liegt daran, dass im ersten Dokument der false
value ist in einem anderen Array verschachtelt und zählt daher nicht als false
Wert (d. h. das Array selbst ist der Wert).
Das zweite Dokument enthält jedoch auch false als eines der Array-Elemente, und daher verursacht dieser Wert $allElementsTrue
zu false
auswerten .