Definition
- $switch
- Evaluates a series of case expressions. When it finds an expression which evaluates to - true,- $switchexecutes a specified expression and breaks out of the control flow.- $switchhas the following syntax:- $switch: { - branches: [ - { case: <expression>, then: <expression> }, - { case: <expression>, then: <expression> }, - ... - ], - default: <expression> - } - The objects in the - branchesarray must contain only a- casefield and a- thenfield.OperandDescription- branches- An array of control branch documents. Each branch is a document with the following fields: - case
- Can be any valid expression that resolves to a
boolean. If the result is not aboolean, it is coerced to a boolean value. More information about how MongoDB evaluates expressions as either true or false can be found here.
 
- then
- Can be any valid expression.
 
 - The - branchesarray must contain at least one branch document.- default- Optional. The path to take if no branch - caseexpression evaluates to- true.- Although optional, if - defaultis unspecified and no branch- caseevaluates to true,- $switchreturns an error.
Behavior
The various case statements do not need to be mutually exclusive.
$switch executes the first branch it finds which
evaluates to true. If none of the branches evaluates to true,
$switch executes the default option.
The following conditions cause $switch to fail with an
error:
- The - branchesfield is missing or is not an array with at least one entry.
- An object in the - branchesarray does not contain a- casefield.
- An object in the - branchesarray does not contain a- thenfield.
- An object in the - branchesarray contains a field other than- caseor- then.
- No - defaultis specified and no- caseevaluates to- true.
| Example | Results | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|  | 
 | |||||||||
|  | 
 | |||||||||
|  | 
 | 
Example
A collection named grades contains the following documents:
{ "_id" : 1, "name" : "Susan Wilkes", "scores" : [ 87, 86, 78 ] } { "_id" : 2, "name" : "Bob Hanna", "scores" : [ 71, 64, 81 ] } { "_id" : 3, "name" : "James Torrelio", "scores" : [ 91, 84, 97 ] } 
The following aggregation operation uses $switch to
display a particular message based on each student's average score.
db.grades.aggregate( [   {     $project:       {         "name" : 1,         "summary" :         {           $switch:             {               branches: [                 {                   case: { $gte : [ { $avg : "$scores" }, 90 ] },                   then: "Doing great!"                 },                 {                   case: { $and : [ { $gte : [ { $avg : "$scores" }, 80 ] },                                    { $lt : [ { $avg : "$scores" }, 90 ] } ] },                   then: "Doing pretty well."                 },                 {                   case: { $lt : [ { $avg : "$scores" }, 80 ] },                   then: "Needs improvement."                 }               ],               default: "No scores found."             }          }       }    } ] ) 
The operation returns the following:
{ "_id" : 1, "name" : "Susan Wilkes", "summary" : "Doing pretty well." } { "_id" : 2, "name" : "Bob Hanna", "summary" : "Needs improvement." } { "_id" : 3, "name" : "James Torrelio", "summary" : "Doing great!" }