MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue

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 .