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 en el arreglo
branchesdeben contener únicamente un campocasey un campothen.OperandoDescripciónbranchesUn arreglo de documentos de la sucursal control. Cada rama es un documento con los siguientes campos:
then- Puede ser cualquier expresión válida.
El arreglo
branchesdebe contener al menos un documento de sucursal.defaultopcional. La ruta a seguir si ninguna expresión de rama
caseevalúa atrue.Aunque es opcional, si
defaultno se especifica y ninguna ramacaseevalúa como verdadera,$switchdevuelve un error.
Comportamiento
Las diversas instrucciones de caso no necesitan ser mutuamente exclusivas. $switch ejecuta la primera rama que encuentra que se evalúa en true. Si ninguna de las ramas se evalúa como verdadera, $switch ejecuta la opción default.
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 el arreglo
branchesno contiene un campocase.Un objeto en el arreglo
branchesno contiene un campothen.Un objeto en el arreglo
branchescontiene un campo que no escaseothen.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!" }