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

时间:2016-07-10 18:43:15

标签: node.js mongodb mongojs

使用以下命令在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()

它返回:

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

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

“5782a4809f3c4cbed9f2a8a1”

当我使用以下内容从此ID获取时间戳时:

ObjectId("5782a4809f3c4cbed9f2a8a1").getTimestamp()

我明白了:

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

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

2 个答案:

答案 0 :(得分:4)

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

获取30a282576f9f2c4772e69cd9示例并在其上切换字节序(见下文)会产生5782a230472c9f6fd99ce672,这在MongoDB shell中正确解释。

以下是代码:

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节点驱动程序。

答案 1 :(得分:1)

问题解决了我在使用版本2.2.0的MongoDB节点驱动程序更新到更新的版本后,一切都按预期工作。