【发布时间】: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