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

Gibt es in MongoDB eine Elseif-Sache für $cond beim Aggregieren

Bei modernen Releases (seit MongoDB 3.4) würden Sie $switch verwenden , was im Grunde das Gegenstück zu switch ist oder Fall Schlüsselwörter in anderen Sprachimplementierungen:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$switch": {
        "branches": [
          { "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
          { "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
        ],
        "default": 10
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
])

Dadurch wird Verschachtelung vermieden der if..then..else Bedingungen wie mit $cond und unten gezeigt. Aber das Folgende zeigt immer noch als Beispiel, dass dies immer getan werden könnte, sogar vor dem new-Operator sogar des expliziten if..then..else Schlüsselwörter, da die ursprüngliche Array-Notation diese Syntax immer beibehalten hat.

Beachten Sie auch, dass ein Array von Bedingungen ist hier in der Regel auch viel einfacher programmatisch zu konstruieren als das Erstellen einer verschachtelten Datenstruktur für die Anweisung, wie sie mit $cond .

Der if..then..else Schlüsselwörter zu $cond -Operator sind zum Zeitpunkt der Erstellung dieses Artikels nur eine neue Ergänzung der letzten Versionen von MongoDB (MongoDB 2.6 war die Einführung der Schlüsselwörter . Der eigentliche Operator war mit der Veröffentlichung des Aggregationsframeworks in MongoDB 2.2 verfügbar. Die Absicht war Klarheit, aber in diesem Fall scheint es etwas Verwirrung gestiftet zu haben.

Als if..then.else Operator $cond ist in der Tat ein ternär Operator, so wie er in vielen Programmiersprachen implementiert wäre. Dies bedeutet, dass als "Inline"-Bedingung alles, was die erste Bedingung nicht erfüllt, unter else gehört, anstatt "Blöcke" der Logik für die Bedingungen zu erstellen .

Daher „schachteln“ Sie die Anweisungen, anstatt Blöcken zu folgen:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": { 
        "if": { "$eq": [ "$field1", "4" ] }, 
        "then": 30,
        "else": {
          "$cond": {
            "if": { "$eq": ["$field1","8"]}, 
            "then": 25, 
            "else": 10
          }
        }
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Oder sogar mit dem originalen Array Notation, die einige bevorzugen könnten, wenn die Anweisung programmatisch erstellt wird:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": [
         { "$eq": [ "$field1", "4" ] }, 
         30,
         { "$cond": [
           { "$eq": ["$field1","8"] },
           25, 
           10
         ]}
      ]
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Ternär bedeutet drei Zustände, nicht mehr und nicht weniger. Also alle if..then..else Logik muss verschachtelt sein.