Med moderne udgivelser (siden MongoDB 3.4) ville du bruge $switch
, som dybest set er modstykket til switch
eller case
søgeord i andre sprogimplementeringer:
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 }
])
Dette undgår indlejring $cond
og vist nedenfor. Men nedenstående viser stadig som et eksempel, at dette altid kunne gøres, selv før den nye operatør af selv den eksplicitte if..then..else
søgeord, da den oprindelige array-notation altid bibeholdt denne syntaks.
Bemærk også, at en array af betingelser her er typisk også meget nemmere at konstruere programmatisk end at skabe en indlejret datastruktur for erklæringen som var nødvendig med $cond
.
if..then..else
søgeord til $cond
operatør er kun en nylig tilføjelse fra nyere versioner af MongoDB i skrivende stund ( MongoDB 2.6 var introduktionen af søgeordene . Den faktiske operatør var tilgængelig med frigivelse af aggregeringsrammerne i MongoDB 2.2). Hensigten var for klarhed, men i dette tilfælde ser det ud til, at det har skabt en vis forvirring.
Som en if..then.else
operatør $cond
er faktisk en ternær
operatør, ligesom det ville blive implementeret i mange programmeringssprog. Dette betyder som en "inline" betinget, snarere end at skabe "blokke" af logik til betingelserne, alt, der ikke opfylder den første betingelse, hører under else
.
Derfor "indlejrer" du udsagn i stedet for at følge blokke:
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 }
]);
Eller endda med det originale array notation, som nogle måske foretrækker, hvis de bygger sætningen programmatisk:
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 betyder tre betingelser, hverken mere eller mindre. Så alle hvis..så..else
logik skal være indlejret.