Для проекта колледжа я импортировал набор данных о потреблении энергии домохозяйствами в свою MongoDB.
набор данных:https://archive.ics.uci.edu/ml/datasets/индивидуальный+бытовой+электрический+мощность+потребление
Для моих целей мне нужно разделить каждый дополнительный замер, сохраняя при этом дату и время. Но также, поскольку этот набор данных относится к 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 году.
Любая помощь приветствуется, заранее спасибо.
Я нашел решение!
Сначала я получил все даты с добавленными 8 годами. А затем повторил его с помощью цикла for each, чтобы добавить новое поле в каждый документ.
Использовал операцию $add поверх операции $dateFromString, чтобы добавить годы к моему значению даты, хотя время нужно было добавить в миллисекундах, что дало мне: 8 * 365 * 24 * 60 * 60000 за 8 лет.
документы mongo об операции $add: 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}})
})
Просто хотел сказать, что для форматирования кода вы можете использовать 4 пробела отступа (выделить код + ctrl-K) или поместить его между наборами тройных обратных кавычек (```)