我有一个文档集合,其中包含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”字段更新为“字符串”数据类型本身。
答案 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"
]
} } },
]
)