MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Existe uma coisa elseif no MongoDB para $ cond ao agregar


Com versões modernas (desde o MongoDB 3.4), você usaria $switch , que é basicamente a contrapartida de switch ou caso palavras-chave em outras implementações de linguagem:
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 }
])

Isso evita aninhamento o if..then..else condições que podem ser feitas usando $cond e mostrado abaixo. Mas o abaixo ainda mostra como exemplo que isso sempre pode ser feito, mesmo antes do novo operador até mesmo do explícito if..then..else palavras-chave já que a notação de array original sempre manteve essa sintaxe.

Observando também que um array de condições aqui normalmente também é muito mais fácil de construir programaticamente do que criar um aninhado estrutura de dados para a declaração conforme necessário com $cond .

O if..then..else palavras-chave para o $cond são apenas uma adição recente das versões recentes do MongoDB no momento da escrita ( MongoDB 2.6 foi a introdução das palavras-chave . O operador real estava disponível com o lançamento da estrutura de agregação no MongoDB 2.2). A intenção era de clareza, mas neste caso parece ter causado alguma confusão.

Como um if..then.else operador $cond é realmente um ternário operador, assim como seria implementado em muitas linguagens de programação. Isso significa que como uma condicional "inline", em vez de criar "blocos" de lógica para as condições, qualquer coisa que não atenda à primeira condição pertence a else .

Portanto, você "aninha" as instruções em vez de seguir os blocos:
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 mesmo com o array original notação, que alguns podem preferir se construir a instrução programaticamente:
db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": [
         { "$eq": [ "$field1", "4" ] }, 
         30,
         { "$cond": [
           { "$eq": ["$field1","8"] },
           25, 
           10
         ]}
      ]
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Ternário significa três condições, nem mais nem menos. Portanto, todos os if..then..else lógica deve ser aninhada.