Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-10689

Add a $switch expression

    • Fully Compatible
    • Query 13 (04/22/16)

      Syntax

          {$project: {
              fieldName: {
                  $switch: {
                      branches: [
                          {
                              case: <expression>,
                              then: <expression>
                          },
                          …
                      ],
                      default: <optional, expression>
                  }
              }
          }}
      

      Examples

      > db.coll.insert([
        {_id: 0, x: 0}
        {_id: 1, x: -1}
        {_id: 2, x: 2}
      ]);
      > db.coll.aggregate([{
        $project: {
          z: {
            $switch: {
              branches: [
                {
                  case: {$eq: ["$x", 0]},
                  then: "Equal to zero."
                },
                {
                  case: {$eq: [{$abs: "$x"}, 1]},
                  then: "Equal to plus or minus one."
                },
              ],
              default: "Something else."
            }
          }
        }
      }])
      {_id: 0, z: "Equal to zero."}
      {_id: 1, z: "Equal to plus or minus one."}
      {_id: 2, z: "Something else."}
      

      Notes

      • Allows $project expressions to be written without convoluted $conds.
      • If "case" does not return a boolean, the value will be coerced to a bool.
      • Since each case does not have to be mutually exclusive, an input will enter the first branch it matches.
        Errors
      • 'branches' is missing or not an array with at least one entry.
      • An entry in 'branches' does not contain 'case'
      • An entry in 'branches' does not contain 'then'
      • If 'default' is not specified, and an input doesn't match, an error will be thrown.

      Old Description:
      Currently if you want to do a multi-way switch statement equivalent in $project you have to do a very messy embedded sequence of {$cond:[]} statements (emulating an if-elif-elif-elif type sequence) which is very unreadable.

      It would be nice to have an operator to do something like:

       'field: {$case:[ {condition1: val1}, {cond2: val2}, etc]}' 

      where the first condition that matches sets the value of field to appropriate val.

      Asya

            Assignee:
            benjamin.murphy Benjamin Murphy
            Reporter:
            asya.kamsky@mongodb.com Asya Kamsky
            Votes:
            7 Vote for this issue
            Watchers:
            14 Start watching this issue

              Created:
              Updated:
              Resolved: