Definition
$switchEvaluates 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.OperandDescriptionbranchesAn 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 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||
|
| |||||||||
|
|
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!" }