从MongoDB ISODate对象丢失的纳秒

时间:2013-07-04 18:13:21

标签: perl mongodb datetime bson isodate

对于ISODate对象,我从MongoDb接口丢失了纳秒。当我在perl中读取它们时,所有纳秒都设置为零。

首先,我的环境:

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

我有一个将rtcTime编码为ISODate的Mongo DB,如下所示:

"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。

要完全重现该问题,请在MongoDB数据库中创建具有任意(非零)hires_epoch值的ISODate对象。然后尝试使用MongoDB / DateTime / DateTime :: Format :: ISO8061模块来提取任何类型的雇佣时间数据。

问:为什么我不能从MongoDB ISODate数据中获得毫秒,微秒或纳秒?

2 个答案:

答案 0 :(得分:3)

这是MongoDB Perl驱动程序与DateTime交互的方式中的错误。当从数据库中检索ISODate值时,驱动程序initializes使用其from_epoch构造函数的DateTime对象。但纳秒部分未传递给构造函数。

DateTime确实支持传递包括纳秒的完整值,并且应该更新驱动程序以解决此问题。

我为此错误创建了ticket,我将修复它。但也许直到假期周末之后。 :)

答案 1 :(得分:2)

MongoDB以BSON格式存储文档,其specification表示:

  

BSON Date是一个64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数。

因此,日期精度仅限于毫秒。如果您确实需要存储纳秒,则不应使用日期类型。你必须使用long并存储时间戳,这样你就不会失去精确度。