Definición
$switchEvalúa una serie de expresiones de casos. Cuando encuentra una expresión que se evalúa como
true,$switchejecuta una expresión especificada y sale del flujo de control.$switchtiene la siguiente sintaxis:$switch: { branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> } Los objetos de la matriz
branchesdeben contener solo un campocasey un campothen.OperandoDescripciónbranchesUna matriz de documentos de la rama de control. Cada rama es un documento con los siguientes campos:
then- Puede ser cualquier expresión válida.
La matriz
branchesdebe contener al menos un documento de rama.defaultOpcional. Ruta a seguir si ninguna expresión de rama
caseevalúa comotrue.Aunque es opcional, si
defaultno se especifica y ninguna ramacasese evalúa como verdadera, devuelve un$switcherror.
Comportamiento
Las distintas sentencias de caso no tienen por qué ser mutuamente excluyentes. ejecuta la primera rama que encuentra y que$switch evalúa true como. Si ninguna de las ramas evalúa como verdadera, ejecuta$switch la default opción.
Las siguientes condiciones hacen que falle con un $switch error:
El campo
branchesfalta o no es un arreglo con al menos una entrada.Un objeto en la matriz
branchesno contiene un campocase.Un objeto en la matriz
branchesno contiene un campothen.Un objeto en la matriz
branchescontiene un campo distinto decaseothen.No se especifica
defaulty ningúncaseevalúatrue.
Ejemplo | Resultados | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||
|
| |||||||||
|
|
Ejemplo
Una colección llamada grades contiene los siguientes 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 ] }
La siguiente operación de agregación utiliza $switch para mostrar un mensaje específico basado en el puntaje promedio de cada estudiante.
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." } } } } ] )
La operación devuelve lo siguiente:
{ "_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!" }