MongoDB更新文档,日期字段为字符串

时间:2019-12-05 01:51:58

标签: node.js database mongodb aggregation-framework

我有一个文档集合,其中包含2个字符串格式的字段,如下面的示例所示

{"starts_at": "2019-12-01T18:51:56", "ends_at": "2019-12-05T18:51:56"}
{"starts_at": "2019-12-03T04:38:24", "ends_at": "2019-12-16T04:38:24"}

如果“ start_at”和“ end_at”之间的差异大于7,我想将“ ends_at”字段更新为额外的1天。预期输出就像更改了第二个文档“ ends_at”一样。

{"starts_at": "2019-12-01T18:51:56", "ends_at": "2019-12-05T18:51:56"}
{"starts_at": "2019-12-03T04:38:24", "ends_at": "2019-12-17T04:38:24"}

我尝试了以下方法

首先,我使用命令

创建了一个具有日期差的新字段。
db.myCollection.aggregate([{$addFields: {
DateDiff:{$trunc:{
$divide:[{
$subtract:[{$dateFromString:{dateString:"$ends_at"}},{$dateFromString:{ dateString: "$starts_at"}}]},
1000*60*60*24]}}
}}])

当我尝试更新集合时,无法找到新创建的字段。对于更新,我使用

db.myCollection.update({DateDiff:{ $gte:7}},
{$set:{"ends_at":{$add:[{$dateFromString:{dateString:"$ends_at"}},1*24*60*60*1000]}}})

如何通过在单个MongoDB命令中添加额外的1天来将“ ends_at”字段更新为“字符串”数据类型本身。

1 个答案:

答案 0 :(得分:0)

  

我想将“ ends_at”字段更新为额外的1天,如果   “ start_at”和“ end_at”之间的差异大于7。

     

预期输出就像更改第二个文档“ ends_at”一样。

以下聚合查询将进行更新。日期运算符$dateFromString$dateToString用于将字符串日期转换为日期字段,进行比较/算术,然后转换回字符串。请注意,该查询适用于MongoDB 4.2版。

db.test.updateMany(
  { },
  [
    { $set: { ends_at: {
                      $cond: [ { $gt: [
                                       { $subtract: [ 
                                              { $dateFromString: { dateString: "$ends_at" } }, 
                                               { $dateFromString: { dateString: "$starts_at" } } 
                                          ] 
                                        },
                                        { $multiply: [ 7, 86400000 ] }
                                   ] 
                                },
                                { $dateToString: { 
                                            date: { $add: [ { $dateFromString: { dateString: "$ends_at" } }, 86400000 ] },
                                            format: "%Y-%m-%dT%H:%M:%S" 
                                 } },
                                 "$ends_at" 
                        ]

    } } },
  ]
)