Mongojs.ObjectId() 产生错误的时间戳

Mongojs.ObjectId() produces wrong timestamp

在我的 node.js 脚本中创建新的 ObjectId 时使用:

mongojs.ObjectId()

我得到一个像

这样的 _id
“f5818257dd0b55ce321f87b5” 

当我使用:

mongojs.ObjectId(“f5818257dd0b55ce321f87b5”).getTimestamp()

我得到:

“Sun Jul 10 2016 19:12:21 GMT+0200 (CEST)"

但是当我在 MongoDB Shell 中使用 ObjectId("f5818257dd0b55ce321f87b5").getTimestamp() 时,我得到:

ISODate("2100-07-10T12:23:51Z")

当我想按 _id 对我的文档进行排序时:

db.stores.find().sort({_id: -1})

返回文档的顺序错误,因为 ObjectId 中的时间戳错误。

如何让 mongojs 以正确的格式生成 ObjectIds

我真的很困惑,谁能帮帮我?

编辑: 当我使用 mongojs 插入文档时,我得到一个 ObjectId,如:

“30a282576f9f2c4772e69cd9”

当我得到时间戳时:

ObjectId("30a282576f9f2c4772e69cd9").getTimestamp()

它returns:

ISODate("1995-11-09T22:36:07Z")

但是当我使用 MongoDB Shell 插入文档时,我得到一个 ObjectId,如:

“5782a4809f3c4cbed9f2a8a1”

当我使用此 ID 获取时间戳时:

ObjectId("5782a4809f3c4cbed9f2a8a1").getTimestamp()

我得到:

ISODate("2016-07-10T19:39:44Z")

这两个文档创建时相隔 5 分钟。 为什么用mongojs插入的ObjectId中的日期是错误的?

这不是一个真正的答案,因为我不知道是谁的错或如何正确修复它,但原因是由于不同的字节顺序。

以您的 30a282576f9f2c4772e69cd9 为例并在其上切换字节顺序(见下文)产生 5782a230472c9f6fd99ce672,它在 MongoDB shell.[=13= 中被正确解释]

代码如下:

let buf1 = Buffer.from('30a282576f9f2c4772e69cd9', 'hex');
let buf2 = Buffer.alloc(buf1.length);

[ 0, 4, 8 ].forEach(o => buf2.writeUInt32LE( buf1.readUInt32BE(o, 4), o ));

console.log(buf1.toString('hex'));
console.log(buf2.toString('hex'));

我认为这与 mongojs 无关,因为那只是使用官方 MongoDB Node 驱动程序。

问题已解决 我使用的是 MongoDB Node 驱动程序的 2.2.0 版,在更新到较新版本后一切正常。