-
Type: New Feature
-
Resolution: Done
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: Aggregation Framework
-
Fully Compatible
-
Query 13 (04/22/16)
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]}'
where the first condition that matches sets the value of field to appropriate val.
Asya
- is depended on by
-
CSHARP-1629 Add a $switch expression
- Closed
- is related to
-
DRIVERS-297 Aggregation Framework Support for 3.4
- Closed