$switch (aggregation)

On this page本页内容

Definition定义

$switch

Evaluates a series of case expressions. 计算一系列大小写表达式。When it finds an expression which evaluates to true, $switch executes a specified expression and breaks out of the control flow.当它找到一个计算结果为true的表达式时,$switch将执行一个指定的表达式并中断控制流。

$switch has the following syntax:语法如下:

$switch: {
   branches: [
      { case: <expression>, then: <expression> },
      { case: <expression>, then: <expression> },
      ...
   ],
   default: <expression>
}

The objects in the branches array must contain only a case field and a then field.branches数组中的对象只能包含一个case字段和一个then字段。

Operand运算数Description描述
branches

An array of control branch documents. 控制分支文档的数组。Each branch is a document with the following fields:每个分支都是包含以下字段的文档:

  • case
    Can be any valid expression that resolves to a boolean. 可以是解析为boolean的任何有效表达式If the result is not a boolean, it is coerced to a boolean value. 如果结果不是boolean,则强制为booleanMore information about how MongoDB evaluates expressions as either true or false can be found here.有关MongoDB如何将表达式求值为truefalse的更多信息,请参阅此处
  • then
    Can be any valid expression.可以是任何有效表达式

The branches array must contain at least one branch document.branches数组必须至少包含一个分支文档。

default

Optional. 可选。The path to take if no branch case expression evaluates to true.如果没有分支case表达式的计算结果为true,则要采用的路径。

Although optional, if default is unspecified and no branch case evaluates to true, $switch returns an error.虽然是可选的,但如果未指定default,并且没有分支的case计算结果为true,则$switch将返回错误。

Behavior行为

The various case statements do not need to be mutually exclusive. 各种案例陈述不需要相互排斥。$switch executes the first branch it finds which evaluates to true. 执行它找到的第一个分支,其计算结果为trueIf none of the branches evaluates to true, $switch executes the default option.如果没有分支的计算结果为true$switch将执行默认选项。

The following conditions cause $switch to fail with an error:以下情况导致$switch失败并出现错误:

  • The branches field is missing or is not an array with at least one entry.branches字段缺失或不是至少有一个条目的数组。
  • An object in the branches array does not contain a case field.branches数组中的对象不包含case字段。
  • An object in the branches array does not contain a then field.branches数组中的对象不包含then字段。
  • An object in the branches array contains a field other than case or then.branches数组中的对象包含casethen以外的字段。
  • No default is specified and no case evaluates to true.未指定default,也没有case计算为true
Example示例Results结果
{
   $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"

Example示例

A collection named grades contains the following documents:名为grades的集合包含以下文档:

{ "_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 ] }

The following aggregation operation uses $switch to display a particular message based on each student's average score.以下聚合操作使用$switch根据每个学生的平均分数显示特定消息。

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."
            }
         }
      }
   }
] )

The operation returns the following:运算结果如下:

{ "_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!" }
Tip提示
See also: 参阅:
←  $sum (aggregation)$tan (aggregation) →