6

我从我的 MongoDB 数据库中获得了一个时间戳,但它只在几秒钟内精确地返回:

2013 年 6 月 6 日星期四 16:15:22 GMT-0400(东部夏令时间)

我需要更大的粒度。有没有办法以毫秒为单位获取 MongoDB 时间戳?

我正在通过 mongoose 在我的 node.js 服务器上进行调用:

var timestamp = new ObjectID().getTimestamp();

我怎样才能得到更精确的东西?

4

2 回答 2

7

ObjectId 以秒为精度存储,您无法更改它。因此,如果您需要毫秒粒度的东西,那么您必须存储自己的时间戳值。

于 2013-06-06T20:40:19.687 回答
0

我一个接一个地生成时间戳,得到了这些:

ObjectId("586a291570b9a181fc2f61ba").getTimestamp();
ISODate("2017-01-02T10:19:01Z")

对于下一个时间戳:

ObjectId("586a291570b9a181fc2f61bc").getTimestamp();
ISODate("2017-01-02T10:19:01Z") 

您会注意到,虽然打印的唯一粒度getTimestamp()是以秒为单位,但还有一个更进一步的粒度会导致 ObjectId 字符串发生变化,即使它们都在01秒。

原因

BSON has a special timestamp type for internal MongoDB use and is not associated with the regular Date type. Timestamp values are a 64 bit value where:

    the first 32 bits are a time_t value (seconds since the Unix epoch)
    the second 32 bits are an incrementing ordinal for operations within a given second.

Within a single mongod instance, timestamp values are always unique.  

所以真正的粒度是 MongoDB 生成的 32 位序数。它与operations within a second,而不是时间值有关,因此您无法以毫秒为单位。

于 2017-03-24T07:26:28.320 回答