Mongodb 聚合无效运算符'$开关';

Mongodb 聚合无效运算符'$开关';,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,将mongoose与Mongodb和node.js一起使用,我想执行一个聚合,该聚合需要确定一个值是否基于时间,这样,如果是,我就可以转换为秒,如果不是基于时间,则保持原样 我将$switch操作符添加到divide操作符以执行此操作。出于某种原因,我不断收到一个错误,指示“MongoError:无效运算符'$switch'” 代码如下所示: $divide: [{ $switch: { branches: [ {

将mongoose与Mongodb和node.js一起使用,我想执行一个聚合,该聚合需要确定一个值是否基于时间,这样,如果是,我就可以转换为秒,如果不是基于时间,则保持原样

我将$switch操作符添加到divide操作符以执行此操作。出于某种原因,我不断收到一个错误,指示“MongoError:无效运算符'$switch'”

代码如下所示:

$divide: [{
    $switch: {
        branches: [
            {
                case: { $eq: [ "$timeType", "min"]},
                then: { $multiply: [ "$route.completedTotal", "60" ] }
            },
            {
                case: { $eq: [ "$timeType", "sec"]},
                then: "$route.completedTotal"
            },
            {
                case: { $eq: [ "$timeType", "hr"]},
                then: { $multiply: [ "$route.completedTotal", "3600" ] }
            }
        ],
        default: "$route.completedTotal"
    }
}, {
    $switch: {
        branches: [
            {
                case: { $eq: [ "$timeType", "min"]},
                then: { $multiply: [ "$route.total", "60" ] }
            },
            {
                case: { $eq: [ "$timeType", "sec"]},
                then: "$route.total"
            },
            {
                case: { $eq: [ "$timeType", "hr"]},
                then: { $multiply: [ "$route.total", "3600" ] }
            }
        ],
        default: "$route.total"
    }
}]
如何修复$switch操作符以使其正常工作?如果在此上下文中无法使用$switch运算符,那么修复此逻辑的替代方法是什么?

如前所述,MongoDB 3.4引入了该方法。虽然在可以升级到该版本的地方升级可能是一个好主意,但自聚合框架发布以来,同样的声明也可以使用:

这是使用
if/then/else
的“keys”语法来澄清,但早期的数组语法仍然有效,基本上意味着可以将语句一直写回MongoDB 2.2


这应该是有意义的,因为在任何其他编程语言实现中的“切换”语句仅仅是一种“更干净”的方式来编写延续中的
if/then/else if
,因此,做相同事情的任何事情都会产生相同的结果,但语法不同。

您的mongodb版本?版本:3.2.11您需要将mongodb版本更新为3.4或3.6,因为3.4之前的版本中没有引入
$switch
"$divide": [
  {
    "$cond": {
      "if": { "$eq": [ "$timeType", "min" ] },
      "then" { "$multiply": [ "$route.completedTotal", "60" ] },
      "else": {
        "$cond": {
          "if": { "$eq": [ "$timeType", "sec"] },
          "then": "$route.completedTotal",
          "else": {
            "$cond": {
              "if": { "$eq": [ "$timeType", "hr"] },
              "then": { "$multiply": [ "$route.completedTotal", "3600" ] },
              "else": "$route.completedTotal"
            }
          }
        }
      }
    }
  },
  {
    "$cond": {
      "if": { "$eq": [ "$timeType", "min" ] },
      "then": { "$multiply": [ "$route.total", "60" ] },
      "else": {
        "$cond": {
          "if": { "$eq": [ "$timeType", "sec" ] },
          "then": "$route.total",
          "else": {
            "$cond": {
              "if": { "$eq": [ "$timeType", "hr" ] },
              "then": { "$multiply": [ "$route.total", "3600" ] },
              "else": "$route.total"
            }
          }
        }
      }
    }
  }
]