2013-07-04 2 views
2

Я теряю наносекунды от интерфейса MongoDb для объекта ISODate. Все наносекунды равны нулю, когда я читаю их в perl.Наносекунды, потерянные от MongoDB Объект ISODate

Во-первых, моя среда:

MongoDB version: 1.8.2 
perl v5.12.4 
MongoDB perl module version: 0.701.4 

У меня есть Монго DB, который имеет rtcTime закодированный как ISODate, следующим образом:

"rtcTime" : ISODate("2013-05-13T18:54:55.918Z") 

Код для извлечения rtcTime выглядит примерно так:

my @results = $db->get_collection('timings')->find()->all(); 
foreach my $record (@results) 
{ 
    print $record->{rtcTime}->nanoseconds()."\n"; 
} 

Выход - все 0.

Чтобы полностью воспроизвести проблему, создайте объект ISODate с произвольными значениями (non-zero) hires_epoch в базе данных MongoDB. Затем попробуйте использовать модули MongoDB/DateTime/DateTime :: Format :: ISO8061 для извлечения любых данных о времени найма.

В: Почему я не могу получить миллисекунды, микросекунды или наносекунды из данных MongodD ISODate?

+0

Какой у этого объекта есть время, как в perl? 'print ref ($ record -> {rtcTime})'? – ysth

ответ

2

MongoDB хранит документы в формате BSON и его specification говорит:

BSON Дата представляет собой 64-битовое целое число, представляющее количество миллисекунд с начала эпохи Unix (Jan 1, 1970).

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

+0

, но вопрос подразумевает, что миллисекунды тоже потеряны, что они просто используют наносекунды() (хотя я считаю, что это ложь, и это действительно наносекунда()), чтобы получить миллисекунды. – ysth

+0

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

+0

код показывает вставку времени с миллисекундами, и они утверждают, что он печатает 0 наносекунд. если он представлен как объект DateTime в perl, в этом случае nanosecond() даст ненулевое значение. – ysth

2

Это ошибка в том, как MongoDB Perl-драйвер взаимодействует с DateTime. Когда значения ISODate извлекаются из базы данных, драйвер initializes объект DateTime использует свой конструктор from_epoch. Но наносекундная часть не передается конструктору.

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

Я создал ticket для этой ошибки, и я исправлю это. Но может быть, только после выходных. :)

+0

Спасибо, фрида! Я подозревал, что это ошибка в интерфейсе MongoDB DateTime. – AndyFroncioni

+0

Фрейдо, еще везет?(Может быть, я должен присоединиться к форуму mongodb.org?) – AndyFroncioni

+1

@ user2551436 извините за задержку. Сегодня я делаю новый релиз, который должен решить проблему. :) – friedo

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