具有多个条件的聚合切换案例语法

时间:2017-11-04 01:18:32

标签: mongodb switch-statement mongodb-query aggregation-framework

我正在尝试在Mongo中执行一个简单的切换案例,但不断收到语法错误消息

db.users.aggregate([
  { $project: {
    "age": 1,
    "Age Group":{
      $switch:{
        branches:[
          {
            case: {$lte:[{"age": "18"}]},
                    then: "Minor"
          },
          {
            case: {$gt:[{"age": "18"}]},
                  {$lte:[{"age": "30"}]},
            then: "Young Adult"
          }
        ],
        default: "No Age Group"
      }
    }
  }}        
])

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

如果您实际拥有MongoDB 3.2,则需要$and来满足多种条件:

db.users.aggregate([
  { "$project": {
    "age": 1,
    "Age Group": {
      "$switch": {
        "branches": [
          {
            "case": { "$lte": ["$age", "18"] },
            "then": "Minor"
          },
          // This one <----
          {
            "case": { 
              "$and": [
                { "$gt": ["$age", "18"] },
                { "$lte": ["$age", "30"] }
              ]
            },
            "then": "Young Adult"
          }
        ],
        "default": "No Age Group"
      }
    }
  }}        
])

实际上,分支实际工作的方式不需要两个条件,因为&#34;第一个分支&#34;将以下分支短路:

db.users.aggregate([
  { "$project": {
    "age": 1,
    "Age Group": {
      "$switch": {
        "branches": [
          {
            "case": { "$lte": ["$age", "18"] },
            "then": "Minor"
          },
          // Just needs the $lte condition
          {
            "case": { "$lte": ["$age", "30"] },
            "then": "Young Adult"
          }
        ],
        "default": "No Age Group"
      }
    }
  }}        
])

最重要的是,$gt$lte逻辑运算符采用&#34;数组&#34;作为一个论点,而不是一个&#34;对象&#34;当你试图使用它们时。这与&#34;查询&#34;不同。运营商表格。

  

注意:您还需要表示&#34;字段值&#34;使用$,否则它只是&#34;字符串&#34;。当然,age的值也是字符串,因此"9"实际上不是&#34;小于&#34; "18"。您可能应修复数据以将其存储为数值。

如果您实际上没有MongoDB 3.2,那么这实际上总是可以通过$cond实现,但只需要更长的语法:

db.users.aggregate([
  { "$project": {
    "age": 1,
    "Age Group": {
      "$cond": {
        "if": { "$lte": ["$age", "18" ] },
        "then": "Minor",
        "else": {
          "if": { "$lte": ["$age", "30"] },
          "then": "Young Adult",
          "else": "No Age Group"
        }
      }
    }
  }}
])

所以&#34;嵌套&#34;的形式$cond基本上是$switch以不同的语法形式执行的操作,没有&#34;嵌套&#34;。但是只要聚合框架已经存在$cond,所以你总能做到这一点。