2010-11-04 4 views
4

Я пишу утилиту на работе, которая преобразует нашу реляционную БД на работу в сложный объект JSON и сбрасывает файлы, сгруппированные по предмету. Затем я хотел бы импортировать эти файлы в коллекции MongoDB с помощью инструмента mongoimport.MongoImport Даты, возникающие до эпохи

Наши данные включают временные метки, которые представляют даты, происходящие до эпохи, соответствующее JSON-представление которых дает отрицательные числа. В то время как MongoDB сам будет обрабатывать эти штрафы, инструменты импорта JSON-парсер использует переменные unsigned long long и терпит неудачу.

Если вы используете специальный формат представления даты JSON Mongo ({"key": { "$date": "value_in_ticks" } }), инструмент импорта выдаст ошибку на этих документах и ​​пропустит импорт. Вы также можете использовать нотацию даты JavaScript ({"key": new Date(value_in_ticks) }), которая будет успешно импортирована, но проанализирована как значение без знака, создающее дату мусора.

Специальный формат даты не работает из-за assertion checking for reserved words. Этот код достигается потому, что наличие отрицательного знака в начале значения приводит к тому, что специальный синтаксический анализ даты заканчивается и возвращается к обычному анализу документа.

code to parse JSON dates явно называет библиотеку форсирования uint_parser. Существует подписанная версия этой функции, и issue on their JIRA tracker уже существует для ее использования (на которой я прокомментировал, что я попытаюсь).

Коротко окунуться в код немедленно, чтобы попробовать и обновить его для подписания, есть ли альтернативный маршрут, который я могу взять, чтобы загрузить эти даты?

Я хочу запустить эту ночь через cron в течение нескольких месяцев для тестирования, поэтому я бы предпочел, чтобы это было очень легко. Эти даты существуют во многих разных частях документов во многих разных коллекциях, поэтому решение должно быть обобщено.

+0

Хотя у меня нет ответа, +1 для хорошо написанного вопроса. – UnkwnTech

ответ

0

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

мой обходной путь импортировать даты как строки (например, «1950-01-01»), и сценарий преобразования с использованием Ruby On Rails с Mongoid:

Dates.each do |d| 
    d.mydate = d.mydate.to_date 
    d.save 
end 

Надеюсь, вы можете приспособить это к тому, что язык/рамки, которые вы используете.

+0

При более тесном осмотре, оскорбительные даты были помещены произвольно в прошлом, чтобы просто удалить их из расчета текущего отчета. Мы просто обновили их, чтобы они появились 1 января 1970 года. –

-2

Шаг 1: перейти на groups.google.com/group/mongodb-user и опубликовать вопрос «mongoimport не поддерживает даты до эпохи». Время отклика на группы, как правило, очень хорошее.

Шаг 2: думайте бежать даты в общепринятом формате, как «1964-04-25 13:23:12»

Это займет немного больше места в MongoDB, потому что вы будете сохранение строки. Тем не менее, это должно быть легко интерпретировать для тех, кто вытаскивает данные.

0

Этот фрагмент Python работает для меня.

import time, struct 

def bson_datetime(adatetime): 
    try: 
     ret = int(1000*(time.mktime(adatetime.timetuple()) + 3600)) 
     if ret < 0: 
      ret = struct.unpack('Q', struct.pack('q', ret))[0] 
     return {'$date': ret} 
    except ValueError: 
     return None 

I.e.

import datetime 
print bson_datetime(datetime.datetime(1950, 12, 30, 0, 0)) 

дает { "а": { "$ Дата": 18446743473920751616}}.

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