Definição
$switchAvalia 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 campocasee um campothen.OperandoDescriçãobranchesUma 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.defaultOpcional. O caminho a ser seguido se nenhuma expressão de ramificação
casefor avaliada comotrue.Embora opcional, se
defaultnão for especificado e nenhuma ramificação forcaseavaliada 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 campocase.Um objeto na array
branchesnão contém um campothen.Um objeto na array
branchescontém um campo diferente decaseouthen.Nenhum
defaulté especificado e nenhumcaseé avaliado comotrue.
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!" }