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.