使用以下命令在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中的日期错误?
答案 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节点驱动程序更新到更新的版本后,一切都按预期工作。