【问题标题】:MongoDB: Creating a calculated field measuring the difference between date fieldsMongoDB:创建一个计算字段来测量日期字段之间的差异
【发布时间】:2021-11-24 15:00:27
【问题描述】:

上下文

这个问题使用与我的另一个问题相同的集合/文档架构构造:MongoDB: Creating calculated fields using the switch function (column aliasing)

数据架构

注意:cal_date1 是我在上面链接的其他帖子中显示的计算值。执行这些步骤时,它们是在管道中完成的,因此(我希望)计算的列可以被视为通用文档架构的一部分,如下所示。

{
  _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",
  cal_date1: "2021-11-03 18:10:57.520"
}

问题

如何计算两个特定日期之间的日期值差异(背后有一些条件逻辑)。

扩展

有没有一种方法可以计算两个日期之间的工作日,其中“工作”被定义为包括周一至周五(不包括周六、周日)在内的日期?

试过

我一直在switch 函数中使用$dateDiff 运算符,如下所示但是遇到错误 unknown operator: $cal_date1

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"
        }
      }
    }
}
])

--updated code
"cal_days_between_date1_caldate1": {
    $switch:
    {
     branches: [
     {case: { $eq: ["$date1", null]}, then: "blank"},
     {case: { $eq: ["$cal_date1", "blank"]}, then: "blank"} 
     ],
default: {
          $dateDiff: {
            startDate: {
              $dateFromString: {
                dateString: "$date1"
              }
            },
            endDate: {
              $dateFromString: {
                dateString: "$cal_date1"
              }
            },
            unit: "day"
          }
        }
    }
}

更新:2021 年 11 月 24 日:世界标准时间 T3:08pm

稍微更改了case 表达式以尝试获得布尔输出,现在出现unknown operator: $dateDiff 的新错误

更新:2021 年 11 月 30 日:世界标准时间晚上 8 点 36 分

已添加包含引用字段(代码块顶部)的代码以及 $dateFromString 运算符的添加。计算出的日期代码旨在作为我与其他字段一起输出的管道中的下一步。

【问题讨论】:

    标签: mongodb mongodb-query mongodb-compass


    【解决方案1】:

    问题是您试图在字符串字段上使用日期运算符。

    您应该使用$dateFromString 将您的字符串转换为之前的日期。检查此playgrounddocs$eq 数组中也有一些错误

    db.collection.aggregate({
      "$project": {
        "cal_days_between_date1_caldate1": {
          $switch: {
            branches: [
              {
                case: {
                  $eq: [
                    "$date1",
                    null
                  ]
                },
                then: "blank"
              },
              {
                case: {
                  $eq: [
                    "$cal_date1",
                    "blank"
                  ]
                },
                then: "blank"
              }
            ],
            default: {
              $dateDiff: {
                startDate: {
                  $dateFromString: {
                    dateString: "$date1"
                  }
                },
                endDate: {
                  $dateFromString: {
                    dateString: "$cal_date1"
                  }
                },
                unit: "day"
              }
            },
            
          }
        }
      }
    })
    

    【讨论】:

    • 感谢您的回复。是的,刚刚注意到我的问题中的$eq 错字。仅在输入问题时,我的实际代码中才出现此问题。另外我仍然收到错误,但是错误似乎是unknown operator: $date1
    • 您确定每个$date1 和其他对字段的引用都包含在" 之间吗?你也可以上传你的代码吗?
    • 是的,它们都有 " 包围它们。添加了一些带有更新消息的代码。
    • 看起来不错,我会尝试执行 2 个单独的 $project 步骤,以确保您计算出的 cal_dateN 字段存在。像这样mongoplayground.net/p/B0u4_Bsz1cc 如果您不断收到错误发布您的 mongoDB 版本。
    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多