Definição
- $switch
- Avalia uma série de expressões de caso. Quando encontra uma expressão que avalia para - true, o- $switchexecuta uma expressão especificada e quebra o fluxo de controle.- $switchtem a seguinte sintaxe:- $switch: { - branches: [ - { case: <expression>, then: <expression> }, - { case: <expression>, then: <expression> }, - ... - ], - default: <expression> - } - Os objetos na array - branchesdevem conter somente um campo- casee um campo- then.OperandoDescrição- branches- Uma array de documentos da ramificação de controle. Cada ramificação é um documento com os seguintes campos: - then
- Pode ser qualquer expressão válida.
 
 - A array - branchesdeve conter pelo menos um documento de ramificação.- default- Opcional. O caminho a ser seguido se nenhuma expressão de ramificação - casefor avaliada como- true.- Embora opcional, se - defaultnão for especificado e nenhuma ramificação for- caseavaliada como verdadeira, retornará um- $switcherro.
Comportamento
As várias declarações de caso não precisam ser mutuamente exclusivas. $switch executa a primeira ramificação que encontra e que é avaliada como true. Se nenhuma das ramificações for avaliada como verdadeira, $switch executará a opção default.
As condições a seguir fazem com que $switch falhe com um erro:
- O campo - branchesestá ausente ou não é uma array com pelo menos uma entrada.
- Um objeto na array - branchesnão contém um campo- case.
- Um objeto na array - branchesnão contém um campo- then.
- Um objeto na array - branchescontém um campo diferente de- caseou- then.
- Nenhum - defaulté especificado e nenhum- caseé avaliado como- true.
| Exemplo | Resultados | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|  | 
 | |||||||||
|  | 
 | |||||||||
|  | 
 | 
Exemplo
Uma coleção chamada grades contém os seguintes documentos:
{ "_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 ] } 
A operação de agregação a seguir usa $switch para exibir uma mensagem específica com base na pontuação média de cada aluno.
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."             }          }       }    } ] ) 
A operação retorna o seguinte:
{ "_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!" }