3

我正在从 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 数据中获取毫秒、微秒或纳秒?

4

2 回答 2

4

MongoDB 以 BSON 格式存储文档,其规范说:

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

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

于 2013-07-04T18:30:45.100 回答
3

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

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

我已经为这个错误创建了一张票,我会修复它。但也许直到假期周末之后。:)

于 2013-07-04T19:05:20.440 回答