Details
-
New Feature
-
Resolution: Done
-
Major - P3
-
None
-
Fully Compatible
-
Query 13 (04/22/16)
Description
Syntax
{$project: {
|
fieldName: {
|
$switch: {
|
branches: [
|
{
|
case: <expression>,
|
then: <expression>
|
},
|
…
|
],
|
default: <optional, expression>
|
}
|
}
|
}}
|
Examples
> db.coll.insert([
|
{_id: 0, x: 0}
|
{_id: 1, x: -1}
|
{_id: 2, x: 2}
|
]);
|
> db.coll.aggregate([{
|
$project: {
|
z: {
|
$switch: {
|
branches: [
|
{
|
case: {$eq: ["$x", 0]},
|
then: "Equal to zero."
|
},
|
{
|
case: {$eq: [{$abs: "$x"}, 1]},
|
then: "Equal to plus or minus one."
|
},
|
],
|
default: "Something else."
|
}
|
}
|
}
|
}])
|
{_id: 0, z: "Equal to zero."}
|
{_id: 1, z: "Equal to plus or minus one."}
|
{_id: 2, z: "Something else."}
|
Notes
- Allows $project expressions to be written without convoluted $conds.
- If "case" does not return a boolean, the value will be coerced to a bool.
- Since each case does not have to be mutually exclusive, an input will enter the first branch it matches.
Errors - 'branches' is missing or not an array with at least one entry.
- An entry in 'branches' does not contain 'case'
- An entry in 'branches' does not contain 'then'
- If 'default' is not specified, and an input doesn't match, an error will be thrown.
Old Description:
Currently if you want to do a multi-way switch statement equivalent in $project you have to do a very messy embedded sequence of {$cond:[]} statements (emulating an if-elif-elif-elif type sequence) which is very unreadable.
It would be nice to have an operator to do something like:
'field: {$case:[ {condition1: val1}, {cond2: val2}, etc]}'
|
Asya
Attachments
Issue Links
- is depended on by
-
CSHARP-1629 Add a $switch expression
-
- Closed
-
- is documented by
-
DOCS-9556 Docs for SERVER-10689: Add a $switch expression
-
- Closed
-
- is related to
-
DRIVERS-297 Aggregation Framework Support for 3.4
-
- Closed
-