S moderními verzemi (od MongoDB 3.4) byste použili $switch
, což je v podstatě protějšek k přepínač
nebo case
klíčová slova v jiných jazykových implementacích:
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 }
])
Vyhnete se tak vnoření if..then..else
podmínek, které lze provést pomocí $cond
a zobrazeno níže. Níže však stále ukazuje jako příklad, že to lze provést vždy, dokonce i před novým operátorem, dokonce i explicitním if..then..else
klíčová slova, protože původní zápis pole vždy zachovával tuto syntaxi.
Všimněte si také, že pole podmínek je zde obvykle také mnohem jednodušší vytvořit programově než vytvořit vnořený datová struktura pro výpis, jak bylo potřeba s $cond
.
if..then..else
klíčová slova do $cond
operátor jsou v době psaní tohoto článku pouze nedávným přírůstkem do posledních verzí MongoDB ( MongoDB 2.6 bylo zavedení klíčových slov . Skutečný operátor byl k dispozici s vydáním agregačního rámce v MongoDB 2.2). Záměrem bylo srozumitelnost, ale v tomto případě se zdá, že to způsobilo určitý zmatek.
Jako if..then.else
operátor $cond
je skutečně ternární
operátor, stejně jako by to bylo implementováno v mnoha programovacích jazycích. To znamená, že jako „inline“ podmínka, spíše než vytváření „bloků“ logiky podmínek, vše, co nesplňuje první podmínku, patří pod else
.
Proto příkazy "vnořujete" spíše než následujete bloky:
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 }
]);
Nebo dokonce s původní polí notace, kterou by někteří mohli preferovat, pokud sestavují příkaz programově:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Ternární znamená tři podmínky, nic více, nic méně. Takže vše if..then..else
logika musí být vnořená.