W nowoczesnych wydaniach (od MongoDB 3.4) użyjesz $switch
, który jest zasadniczo odpowiednikiem switch
lub przypadek
słowa kluczowe w innych implementacjach językowych:
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 }
])
Pozwala to uniknąć zagnieżdżania if..then..else
warunki, jak można to zrobić za pomocą $cond
i pokazano poniżej. Ale poniżej nadal pokazuje jako przykład, że zawsze można to zrobić, nawet przed nowym operatorem nawet jawnym if..then..else
słowa kluczowe, ponieważ oryginalna notacja tablicowa zawsze utrzymywała tę składnię.
Zauważając również, że tablica warunków tutaj jest zazwyczaj o wiele łatwiej skonstruować programowo niż tworzenie zagnieżdżonych struktura danych dla oświadczenia zgodnie z potrzebami $cond
.
if..then..else
słowa kluczowe do $cond
Operatory są tylko ostatnim dodatkiem w ostatnich wersjach MongoDB w momencie pisania (MongoDB 2.6 było wprowadzeniem słów kluczowych . Rzeczywisty operator był dostępny wraz z wydaniem struktury agregacji w MongoDB 2.2 ). Intencją była przejrzystość, ale w tym przypadku wydaje się, że spowodowało to pewne zamieszanie.
Jako if..then.else
operator $cond
jest rzeczywiście trójargumentem
operatora, tak jak byłoby to zaimplementowane w wielu językach programowania. Oznacza to, że jako warunek „wbudowany”, zamiast tworzenia „bloków” logiki do warunków, wszystko, co nie spełnia pierwszego warunku, należy do else
.
Dlatego „zagnieżdżasz” instrukcje, a nie podążasz za blokami:
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 }
]);
Lub nawet z oryginalną tablicą notacja, którą niektórzy mogą preferować przy programowym tworzeniu instrukcji:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Ternar oznacza trzy warunki, ni mniej, ni więcej. Więc wszystkie if..then..else
logika musi być zagnieżdżona.