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