如何为存储在mongo集合中的String格式存储的所有日期添加年数

时间:2019-05-29 20:25:20

标签: mongodb

对于一个大学项目,我已经在MongoDB上导入了家庭能源消耗数据集。

数据集:https://archive.ics.uci.edu/ml/datasets/individual+household+electric+power+consumption

出于我的目的,我需要拆分每个子计量,同时仍要保留日期和时间。而且由于该数据集来自2006年,所以我想在日期前加上8年,所以我有一个更接近现在的日期。

我一直遵循的方法是为每个子测光创建一个视图。

我的文档结构:

{
    "_id" : ObjectId("5ceec64e871bf4fa89a7f4f3"),
    "Date" : "16/12/2006",
    "Time" : "17:24:00",
    "Global_active_power" : 4.216,
    "Global_reactive_power" : 0.418,
    "Voltage" : 234.84,
    "Global_intensity" : 18.4,
    "Sub_metering_1" : 0.0,
    "Sub_metering_2" : 1.0,
    "Sub_metering_3" : 17.0
}

并且我使用以下内容创建视图:

db.createView("sub_metering1","sensor",[{$project: {"_id":"$_id","datetime":{ $dateFromString:{ dateString: {$concat:[ "$Date"," ","$Time"]},format:"%d/%m/%Y %H:%M:%S" }},"metering":"$Sub_metering_1"}}])

视图工作正常,但是我根本不知道如何将8年添加到原始日期。我试图先查找然后再更新forEach,但是文档没有更新,执行起来也花费了很长时间。

数据集开始于2006年,结束于2010年,我希望将日期推迟8年,所以它开始于2014年,结束于2018年。

欢迎您的帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!

首先,我检索了所有添加了8年的日期。然后使用for每个循环对其进行迭代,以向每个文档添加一个新字段。

在$ dateFromString操作的顶部使用$ add操作将年份添加到我的日期值中,但是时间必须以毫秒为单位,这使我:8 * 365 * 24 * 60 * 60000,持续8年

有关$ add操作的mongo文档:https://docs.mongodb.com/manual/reference/operator/aggregation/add/

请在下面找到我的脚本:

 var datetime=db.sensor.aggregate([
        {$project:{ "_id":"$_id", "datetime": { $add:[
            { $dateFromString:{ dateString: {$concat:[ "$Date"," ","$Time"]},format:"%d/%m/%Y %H:%M:%S" }}
            ,8*365*24*60*60000    
            ]}}}
    ])

    datetime.forEach(function(doc){
            db.sensor.updateMany({_id:doc._id},{$set: {datetime:doc.datetime}})
        })
相关问题