С модерни версии (от MongoDB 3.4) ще използвате $switch
, което по същество е противоположно на switch
или case
ключови думи в други езикови реализации:
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 }
])
Това избягва влагането if..then..else
условия, както може да се направи с помощта на $condкод>
и показано по-долу. Но по-долу все още показва като пример, че това винаги може да се направи, дори преди новия оператор дори на изричния if..then..else
ключови думи, тъй като оригиналната нотация на масива винаги поддържаше този синтаксис.
Отбелязвайки също, че масив от условия тук обикновено също е много по-лесно да се конструира програмно, отколкото създаването на вложено структура на данните за израза, както беше необходимо с $condкод>
.
if..then..else
ключови думи към $cond
са само скорошна добавка към последните версии на MongoDB към момента на писане ( MongoDB 2.6 беше въвеждането на ключовите думи . Действителният оператор беше наличен с пускането на рамката за агрегиране в MongoDB 2.2). Намерението беше за яснота, но в този случай изглежда е предизвикало известно объркване.
Като if..then.else
оператор $cond
наистина е троичен
оператор, точно както би бил приложен в много езици за програмиране. Това означава, че като „вградено“ условие, вместо да създава „блокове“ на логиката към условията, всичко, което не отговаря на първото условие, принадлежи към else
.
Следователно вие „влагате“ изразите, вместо да следвате блокове:
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 }
]);
Или дори с оригиналния масив нотация, която някои може да предпочетат, ако изграждат оператора програмно:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Тернарен означава три условия, нито повече, нито по-малко. Така че всички if..then..else
логиката трябва да бъде вложена.