对于一个大学项目,我已经在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年。
欢迎您的帮助,谢谢。
答案 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}})
})