Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$switch (agregação)

Nesta página

  • Definição
  • Comportamento
  • Exemplo
$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 campo case e um campo then.

Operando
Descrição
branches

Uma array de documentos da ramificação de controle. Cada ramificação é um documento com os seguintes campos:

  • case
    Pode ser qualquerexpressão válida que resolva para boolean. Se o resultado não for um boolean, ele será forçado para um valor booleano. Mais informações sobre como o MongoDB avalia expressões como verdadeiras ou falsas podem ser encontradas aqui.
  • 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 como true.

Embora seja opcional, se default não for especificado e nenhuma ramificação case for avaliada como verdadeira, $switch retornará um erro.

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 campo case.

  • Um objeto na array branches não contém um campo then.

  • Um objeto na array branches contém um campo diferente de case ou then.

  • Nenhum default é especificado e nenhum case é avaliado como true.

Exemplo
Resultados
{
$switch: {
branches: [
{ case: { $eq: [ 0, 5 ] }, then: "equals" },
{ case: { $gt: [ 0, 5 ] }, then: "greater than" },
{ case: { $lt: [ 0, 5 ] }, then: "less than" }
]
}
}
"less than"
{
$switch: {
branches: [
{ case: { $eq: [ 0, 5 ] }, then: "equals" },
{ case: { $gt: [ 0, 5 ] }, then: "greater than" }
],
default: "Did not match"
}
}
"Did not match"
{
$switch: {
branches: [
{ case: "this is true", then: "first case" },
{ case: false, then: "second case" }
],
default: "Did not match"
}
}
"First case"

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!" }

Dica

Veja também:

Voltar

$sum

Próximo

$tan