On this page
$switch (aggregation)
On this page
Definition
$switch- 
     
New in version 3.4.
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 acasefield and athenfield.Operand Description branchesAn 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.defaultOptional. The path to take if no branch
caseexpression evaluates totrue.Although optional, if
defaultis unspecified and no branchcaseevaluates 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 acasefield. - An object in the 
branchesarray does not contain athenfield. - An object in the 
branchesarray contains a field other thancaseorthen. - No 
defaultis specified and nocaseevaluates totrue. 
| Example | Results | 
|---|---|
        
           | 
       "less than" | 
      
        
           | 
       "Did not match" | 
      
        
           | 
       "First case" | 
      
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!" }
     See also