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

MongoDB $anyElementTrue

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 .