【问题标题】:Nanoseconds lost coming from MongoDB ISODate Object来自 MongoDB ISODate 对象的纳秒损失
【发布时间】:2013-07-02 19:21:45
【问题描述】:

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

【问题讨论】:

  • 在 perl 中它拥有什么样的对象? print ref($record->{rtcTime})?

标签: perl mongodb datetime bson isodate


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢弗里多!我怀疑这是 DateTime MongoDB 界面中的错误。
  • 弗雷多,好运了吗? (也许我应该加入 mongodb.org 论坛?)
  • @user2551436 抱歉耽搁了。我今天正在做一个新版本,应该可以解决这个问题。 :)
  • @user2551436 此错误已在发行版0.702.0 中修复。
【解决方案2】:

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

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

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

【讨论】:

  • 但问题暗示毫秒也丢失了,他们只是使用 nanoseconds() (尽管我认为这是一个谎言,实际上是 nanosecond())来获取毫秒。
  • 好吧,他/她说正在丢失纳秒并且代码正在打印纳秒,所以我认为问题出在纳秒上。
  • 该代码显示插入一个以毫秒为单位的时间,他们声称它打印了 0 纳秒。如果它在 perl 中被表示为 DateTime 对象,那么在这种情况下 nanosecond() 将给出一个非零值。
  • 感谢您的回复。并为不清楚而道歉。我举了一个这个问题的一个方面的例子。与hires_epoch 相关的时间字段都不起作用。不是毫秒、微秒或纳秒。问题似乎是 MongoDB perl 接口不传输招聘值。
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多