【问题标题】:Mongojs.ObjectId() produces wrong timestampMongojs.ObjectId() 产生错误的时间戳
【发布时间】:2016-07-11 20:19:23
【问题描述】:

在我的 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中的日期是错误的?

【问题讨论】:

  • 您使用的是什么版本的 MongoDB Node.js 驱动程序?我可以使用 2.2.0 节点驱动程序(并引发 jira.mongodb.org/browse/NODE-749)重现这种不正确的行为,但 2.1.21 和旧版本似乎还不错。
  • 谢谢,我确实在使用 mongodb 2.2.0,我更新到 2.2.1,现在它可以正常工作了。

标签: node.js mongodb mongojs


【解决方案1】:

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

以您的 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 Node 驱动程序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 1970-01-01
      • 2020-10-06
      • 2020-05-16
      • 2017-06-09
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      相关资源
      最近更新 更多