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 está especificado y ninguna ramacasese evalúa como verdadera, devuelve un$switcherror.
Comportamiento
Las distintas sentencias condicionales no tienen por qué ser mutuamente excluyentes. ejecuta la primera rama que encuentra que se$switch evalúa true como. Si ninguna de las ramas se evalúa como verdadera, ejecuta$switch la default opción.
Las siguientes condiciones provocan 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 para mostrar un mensaje particular basado en la puntuación promedio de cada $switch 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!" }