【问题标题】:MongoDB: Creating calculated fields using the switch function (column aliasing)MongoDB:使用 switch 函数创建计算字段(列别名)
【发布时间】:2021-11-24 09:51:12
【问题描述】:

注意

我对 MongoDB 完全陌生,所以我的术语可能不完全正确。

上下文

我在 MongoDB 中有一些不同日期的数据,我正在尝试使用 $switch 函数来提供列别名以形成一些新的计算列但是我是遇到一些问题(可能是语法或错误实现),想知道为什么以及如何解决。

问题

基本上我想创建一个新的计算日期列,如果它不为空,则它采用日期字段的值,否则如果它不为空,它采用另一个日期字段的值等等,但是它默认为一些消息"blank" 如果这些字段中没有值。

架构

带有集合的单个文档遵循这种粗略的结构

{
  _id:ObjectId("619756f12c115f24df503c26")
  uniqueid:"12345678"
  date1:"2021-11-02 20:04:50.253"
  date2:"2021-11-03 18:10:57.520"
  date3:"2021-11-08 07:08:00.000"
  date4:"2021-11-08 14:40:00.000"
  date5:"2021-11-08 08:34:00.000"
}

试过

作为聚合管道的一部分,我尝试使用 $project,然后返回所有列以及新计算的列,但是在此阶段出现错误说 stage must be a properly formatted document 导致我相信我的语法是错误的,或者可能使用了错误的运算符来执行此操作。

如果我删除计算列代码,那么预览似乎可以工作(进一步说服我它与我的计算列实现有关)。

db.collection.aggregate([
{
$project:
      {
      "uniqueid": 1,
      "date1": 1,
      "date2": 1,
      "date3": 1,
      "date4":1,
      "date5": 1,
      "cal_date1": {
          $switch: {
            branches: [
                { case: {"$date2": {$ne: null}}, then: "$date2"},
                { case: {"$date3": {$ne: null}}, then: "$date3"},
                { case: {"$date4": {$ne: null}}, then: "$date4"},
                { case: {"$date5": {$ne: null}}, then: "$date5"}
            ],
            default: "blank"
          }
        },
      "cal_date2": {
          $switch: {
            branches: [
                { case: {"$date4": {$ne: null}}, then: "$date4"},
                { case: {"$date5": {$ne: null}}, then: "$date5"}
            ],
            default: "blank"
          }
        },
       "cal_date3": {
          $switch: {
            branches: [
                { case: {"$date5": {$ne: null}}, then: "$date5"}
            ],
            default: "blank"
        }
      }
    }
}
])

更新 1:2021-11-24 T12:15pm UTC

我在每个 case 表达式的末尾添加了一个缺少的大括号。现在的错误是unknown operator: $date2

【问题讨论】:

  • 将此case: {"$date4": {$ne: null}}, 更改为大小写:{$ne:["$date4",null]}, in all of aggregate
  • 刚试了一下,没成功,做了一些小改动,觉得成功了!我将创建一个答案,但如果您可以添加/编辑它的工作原理,那就太好了!
  • 我将此添加为答案,如果可能,请接受我的答案

标签: mongodb mongodb-query mongodb-compass


【解决方案1】:

将这个 case: {"$date4": {$ne: null}} 更改为 case: {$ne:["$date4",null]},全部汇总

【讨论】:

    【解决方案2】:

    说明

    似乎我的语句的语法是导致问题的原因(不知道为什么)。如果有人能详细说明,那就太好了。

    回答

    代码如下:

    db.collection.aggregate([
    {
    $project:
          {
          "uniqueid": 1,
          "date1": 1,
          "date2": 1,
          "date3": 1,
          "date4":1,
          "date5": 1,
          "cal_date1": {
              $switch: {
                branches: [
                    { case: {$ne:["$date2",null]}, then: "$date2"},
                    { case: {$ne:["$date3",null]}, then: "$date3"},
                    { case: {$ne:["$date4",null]}, then: "$date4"},
                    { case: {$ne:["$date5",null]}, then: "$date5"}
                ],
                default: "blank"
              }
            },
          "cal_date2": {
              $switch: {
                branches: [
                    { case: {$ne:["$date4",null]}, then: "$date4"},
                    { case: {$ne:["$date4",null]}, then: "$date5"}
                ],
                default: "blank"
              }
            },
           "cal_date3": {
              $switch: {
                branches: [
                    { case: {$ne:["$date5",null]}, then: "$date5"}
                ],
                default: "blank"
            }
          }
        }
    }
    ])
    

    注意到每个语句中的 {"$date_value": {$ne: null}} 已更改为 {$ne:["$date_value",null]} 可能是由于 $ne 运算符需要 2 个参数?

    【讨论】:

    • 是的,在投影 $ne $lt 和一些像这样的操作需要数组
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2021-10-03
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多