mongodb如何处理2038年1月19日星期二之后的ObjectId时间戳?

Bas*_*awi 5 timestamp mongodb

根据MongoDB官方文档,它指出:

ObjectId值由12个字节组成,其中前四个字节是反映ObjectId创建的时间戳,尤其是:

  • 一个4字节的值,表示自Unix时代以来的秒数,
  • 一个3字节的机器标识符,
  • 一个2字节的进程ID,以及
  • 一个3字节的计数器,以随机值开头。

我只是想知道2038年1月19日星期二格林尼治标准时间会发生什么当时unix时间等于2147483648,这不适合ObjectId * philosoraptor meme *中的4字节时间戳

Ale*_*lex 5

无符号 2,147,483,648 完全适合 4 个字节。4 个字节足以容纳高达4,294,967,295 的值,这是2106 年 2 月 7 日星期日 06:28:16 GMT的 unix 纪元。

如果 ObjectID 在此之前没有更改而继续存在,则时间戳部分将从 0 开始,如果您关心:

> new Date();
ISODate("2106-02-08T12:41:20.450Z")

> db.t.insert({welcome:"from the future"});
WriteResult({ "nInserted" : 1 })

> db.t.find().pretty();
{
    "_id" : ObjectId("0001a7b306c389186a3a9323"),
    "welcome" : "from the future"
}

> db.t.find()[0]._id.getTimestamp();
ISODate("1970-01-02T06:07:47Z")
Run Code Online (Sandbox Code Playgroud)