МонгоИмпорт Даты, происходящие до эпохи - PullRequest
4 голосов
/ 04 ноября 2010

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

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

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

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

Код для синтаксического анализа дат JSON в явном видевызывает библиотеку наддува uint_parser.Существует подписанная версия этой функции, и проблема на их трекере JIRA уже существует, чтобы использовать ее (на что я прокомментировал, что я попытаюсь).

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

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

Ответы [ 3 ]

0 голосов
/ 06 мая 2011

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

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

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

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

0 голосов
/ 26 ноября 2013

Этот фрагмент кода 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

Т.е.

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

yields {"abc": {"$ date": 18446743473920751616}}.

0 голосов
/ 04 ноября 2010

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

Шаг 2 : представьте даты выполнения в общепринятом формате, например "1964-04-25 13:23:12"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...