2015-12-29 2 views
0

У меня есть дата, которая находится в этом формате в моей базе данных MongoDB.Преобразование даты в MongoDB ISO Дата

{ 
     "_id": ObjectId("5682e899f326d45c821d8b9b"), 
     "City": "Atlanta", 
     "Date": "12/5/02", 
     "Temp": 78.5, 
} 

Я хотел бы преобразовать это в дату ISO, чтобы я мог сортировать по дате в моей базе данных. Каким будет лучший способ сделать это с помощью команды обновления с PyMongo или JavaScript.

+0

Вы хотите обновить свои документы, изменив 'Date' на ISODate? – styvane

+0

вам нужно прочитать документы, добавить объект даты, а затем сохранить их снова – Valijon

ответ

-1

Я думаю, вы должны сначала получить записи и использовать цикл, чтобы изменить все. Затем вы должны проанализировать данные для построения объекта Date для преобразования в дату mongo.

var value = "12/5/02"; 
var parts = value.split("/"); 
var dt = new Date("20"+parts[2], parseInt(parts[1])-1, parts[0]); 

Если вы используете nodejs, проверьте this тоже.

Редактировать: Я предположил 12 = день, 5 = месяц.

+0

Запустили ли вы свой код на указанную дату примера? Я не думаю, что это делает то, на что вы надеялись, это будет – Andy

+0

@ Энди, почему бы вам не подумать? – abeyaz

+0

Потому что, когда я запускаю его, он выходит с неправильной датой. – Andy

0

Mongo немного изменился с тех пор, как я его использовал, но насколько я знаю, как было предложено в другом месте, вам придется загружать и обновлять каждую запись по очереди.

У вас есть две проблемы. Во-первых, ваш формат даты неоднозначен. Дата, указанная в примере, будет иметь разные значения в зависимости от локали системы, используемой для ее анализа в качестве даты. В США это (я думаю) 5 декабря 2002 года. На моей стороне атлантического, хотя он будет разбираться с 12 мая 2002 года. Funtimes.

Предполагая, что вы знаете в intented формат каждой даты, то в узле можно использовать moment.js разобрать каждую дату в фиксированном формате, например

let date = moment(document.Date, "D/M/YY"); 

, а затем вывода в качестве даты ISO с использованием

document.Date = date.toISOString(); 

или если вы в настоящее время хорошо, и делать это неразрушающим

document.ISODate = date.toISOString(); 

хотя теперь у вас есть две даты, чтобы посмотреть после того, как ...

0

Вам нужно будет перебирать весь набор результатов, а также обновлять каждый документ по отдельности, так как:

var f = function(e) { 
    var arr = e['Date'].split("/"); 

    //assuming "Date" field was formatted as "YY/MM/DD" 
    var date_obj = new Date(arr[0], arr[1], arr[2]); 

    db.your_collection.update({_id: e['_id']}, {$set: {date_obj: date_obj}});  
} 


db.your_collection.find().forEach(f) 

Если вы хотите удалить ваше старое поле, вы можете выполнить следующую команду:

db.your_collection.update({}, {$unset: {Date: 1}}, {multi:true}); 

Но не делайте этого, пока вы не уверены, что ваши даты были преобразованы правильно.

+0

Использование массовых операций сделает это более эффективным. –

+0

@MarkusWMahlberg - как будут выполняться массовые операции, если для каждого документа значение update 'date_obj' отличается? –

+0

В верхней части моей головы для 2.6: 'var bulk = db.c.initializeUnorderedBulkOp(); var f = function (e) {... var d = ...; bulk.find (запрос) .update (upDoc);}; db.c.find (запрос) .forEach (е); bulk.execute() '. Соответственно, для 3.0 –

Смежные вопросы