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 seja opcional, se
defaultnão for especificado e nenhuma ramificaçãocasefor avaliada como verdadeira,$switchretornará 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
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
O exemplo a seguir usa a coleção movies do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação, consulte Carregar o conjunto de dados de amostra.
Esta operação de agregação usa $switch para exibir uma mensagem específica com base na classificação de cada filme. O estágio $match limita os resultados aos três filmes mais longos no conjunto de dados de amostra:
db.movies.aggregate( [ { $match: { runtime: { $gt: 800 } } }, { $project: { _id: 0, title: 1, summary: { $switch: { branches: [ { case: { $gte: [ "$imdb.rating", 9 ] }, then: "Doing great!" }, { case: { $and: [ { $gte: [ "$imdb.rating", 8 ] }, { $lt: [ "$imdb.rating", 9 ] } ] }, then: "Doing pretty well." }, { case: { $lt: [ "$imdb.rating", 8 ] }, then: "Needs improvement." } ], default: "No rating found." } } } }, { $sort: { title: 1 } }] )[ { title: 'Baseball', summary: 'Doing great!' }, { title: 'Centennial', summary: 'Doing pretty well.' }, { title: 'Taken', summary: 'Needs improvement.' }]Dica