1

我想在蒙戈做一个简单的开关情况,但总是收到语法错误信息汇聚交换机案例语法

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

只要你确实有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" 
     } 
    } 
    }}   
]) 

其实不然,虽然,实际上分支工作,你并不需要两个条件,因为“第一支”短的方式-circuits如下分支:

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逻辑运算符,你试图使用他们采取“阵列”作为参数,而不是一个“对象”。这与“查询”操作符表单不同。

注:还需要表示“字段值”与$,否则它只是一个“串”。当然age的值也是字符串,所以"9"实际上并不是“小于”"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" 
     } 
     } 
    } 
    }} 
]) 

那么的“嵌套”这种形式$cond基本上是什么$switch用不同的语法形式,没有“嵌套”。但是$cond只要聚合框架一直存在,所以你总是可以做到这一点。