$switch (agregação)
Nesta página
Definição
$switch
Novidade na versão 3.4.
Avalia uma série de expressões de caso. Quando encontra uma expressão que avalia para
true
, o$switch
executa uma expressão especificada e quebra o fluxo de controle.$switch
tem a seguinte sintaxe:$switch: { branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> } Os objetos na array
branches
devem conter somente um campocase
e um campothen
.OperandoDescriçãobranches
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
branches
deve conter pelo menos um documento de ramificação.default
Opcional. O caminho a ser seguido se nenhuma expressão de ramificação
case
for avaliada comotrue
.Embora seja opcional, se
default
não for especificado e nenhuma ramificaçãocase
for avaliada como verdadeira,$switch
retornará um erro.
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
branches
está ausente ou não é uma array com pelo menos uma entrada.Um objeto na array
branches
não contém um campocase
.Um objeto na array
branches
não contém um campothen
.Um objeto na array
branches
contém um campo diferente decase
outhen
.Nenhum
default
é especificado e nenhumcase
é avaliado comotrue
.
Exemplo | Resultados | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
| "less than" | |||||||||
| "Did not match" | |||||||||
| "First case" |
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!" }