Как добавить количество лет ко всем датам, хранящимся в формате String, хранящимся в коллекции mongo

Для проекта колледжа я импортировал набор данных о потреблении энергии домохозяйствами в свою 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 году.

Любая помощь приветствуется, заранее спасибо.

Просто хотел сказать, что для форматирования кода вы можете использовать 4 пробела отступа (выделить код + ctrl-K) или поместить его между наборами тройных обратных кавычек (```)

Chris B. 29.05.2019 22:39
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
1
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение!

Сначала я получил все даты с добавленными 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}})
        })

Другие вопросы по теме