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 版,在更新到较新版本后一切正常。
在我的 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 版,在更新到较新版本后一切正常。