在聚合时MongoDB中是否存在$ cond的elseif

hum*_*kie 17 mongodb mongodb-query aggregation-framework

所以我需要一个在MongoDB中计算的自定义字段,如下所示

if( field1 =="A")  ->customfield=10
else if(field1 =="B"  )->customfield=20
else (field1 =="C" ) ->customfield=15
Run Code Online (Sandbox Code Playgroud)

我正在使用聚合以及$ project语句.但$ cond运算符不允许elseif(subbranching else)并且只允许两个静态分支if和else.使用嵌套的elseif原因

"exception: field inclusion is not allowed inside of $expressions"

继承人我的查询(这给了我错误)

db.items.aggregate([ { $project :
{
     name: 1,
     customfield:
     {
         $cond: { if: { $eq: [ "$field1", "4" ] }, then: 30,
                else: {
                    if: 
                    { $eq: ["$field1","8"]}, 
                    then: 25, else: 10}}
               }
           }},{ $sort: { customfield: 1 }},{$limit:12}]);
Run Code Online (Sandbox Code Playgroud)

有没有一种方法或解决方法.如果这是一个重复的问题我很抱歉,但我找不到类似的问题.

Nei*_*unn 35

在编写本文时,运营商的$switch关键字switch仅是最近版本的MongoDB的新增内容.目的是为了清楚,但在这种情况下,它似乎引起了一些混乱.

作为case运算符if..then..else确实是三元运算符,就像在许多编程语言中实现的一样.这意味着作为"内联"条件,而不是为条件创建逻辑"块",任何不符合第一个条件的东西都属于$cond.

因此,您"嵌套"语句而不是跟随块:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$switch": {
        "branches": [
          { "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
          { "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
        ],
        "default": 10
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
])
Run Code Online (Sandbox Code Playgroud)

三元意味着三个条件,不多也不少.所以所有if..then..else逻辑都必须嵌套.


nor*_*ort 12

MongoDB 3.4有一个新东西$switch需要这个确切的东西!

$switch: {
   branches: [
      { case: <expression>, then: <expression> },
      { case: <expression>, then: <expression> },
      ...
   ],
   default: <expression>
}
Run Code Online (Sandbox Code Playgroud)

https://docs.mongodb.com/manual/reference/operator/aggregation/switch/