MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Y a-t-il une chose elseif dans MongoDB à $cond lors de l'agrégation

Avec les versions modernes (depuis MongoDB 3.4), vous utiliseriez $switch , qui est essentiellement l'équivalent de switch ou case mots-clés dans d'autres implémentations de langage :

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 }
])

Cela évite l'imbrication le if..then..else conditions comme cela peut être fait en utilisant $cond et illustré ci-dessous. Mais ce qui suit montre toujours à titre d'exemple que cela pourrait toujours être fait, même avant le nouvel opérateur même de l'explicite if..then..else mots-clés puisque la notation de tableau d'origine a toujours conservé cette syntaxe.

Notant également qu'un tableau des conditions ici est généralement aussi beaucoup plus facile à construire par programmation que de créer un imbriqué structure de données pour la déclaration comme cela était nécessaire avec $cond .

Le if..then..else mots-clés au $cond L'opérateur n'est qu'un ajout récent à partir des versions récentes de MongoDB au moment de la rédaction (MongoDB 2.6 était l'introduction des mots clés . L'opérateur réel était disponible avec la publication du cadre d'agrégation dans MongoDB 2.2). L'intention était de clarifier, mais dans ce cas, cela semble avoir causé une certaine confusion.

En tant que if..then.else opérateur $cond est bien un ternaire opérateur, tout comme cela serait implémenté dans de nombreux langages de programmation. Cela signifie qu'en tant que condition "en ligne", plutôt que de créer des "blocs" de logique pour les conditions, tout ce qui ne remplit pas la première condition appartient à else .

Par conséquent, vous "imbriquez" les instructions plutôt que de suivre les blocs :

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 }
]);

Ou même avec le tableau d'origine notation, que certains pourraient préférer s'ils construisaient l'instruction par programme :

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

Ternaire signifie trois conditions, ni plus ni moins. Donc tout if..then..else la logique doit être imbriquée.