当前位置: 首页 > 知识库问答 >
问题:

Mongojs。ObjectId()生成错误的时间戳

冉弘化
2023-03-14

在我的节点中创建新ObjectId时。js脚本使用:

mongojs.ObjectId()

我有一个_id像

“f5818257dd0b55ce321f87b5” 

当我使用:

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

我得到:

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

但是当我使用ObjectId(“f5818257dd0b55ce321f87b5”)时。getTimestamp()在MongoDB Shell中我得到:

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

当我想按\u id对文档进行排序时:

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

由于ObjectId中的时间戳错误,文档以错误的顺序返回。

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

我真的很困惑,有人能帮我吗?

编辑:当我用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分钟。为什么ObjectId中插入mongojs的日期是错误的?

共有2个答案

梁锋
2023-03-14

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

胥玮
2023-03-14

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

以您的30a282576f9f2c4772e69cd9为例,在其上切换endianness(见下文)将产生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节点驱动程序。

 类似资料:
  • 本文向大家介绍python根据时间生成mongodb的ObjectId的方法,包括了python根据时间生成mongodb的ObjectId的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python根据时间生成mongodb的ObjectId的方法。分享给大家供大家参考。具体分析如下: mongodb的_id为ObjectId类型,ObjectId内是包含时间戳信息的,这样我们在保

  • 我有以下代码片段 我尝试运行应用程序时出现以下错误(部分) 似乎type="num "没有被处理。我怀疑年龄int也可能是一个问题,因为它是一个int,但需要一个string。从sting到int的反向转换也可能是一个问题。 任何帮助是值得赞赏的。 谢谢

  • 另一个问题询问如何从现有的字符串表示形式创建。在本例中,您已经有了ID的字符串表示形式--它可能是也可能不是普遍唯一的--并且您正在将其解析为。

  • 大约34小时前,我生成了一个签名的apk,但现在,我无法生成一个签名的apk,我不知道如何解决这个问题。请帮忙 这是我的输出消息 > 错误:任务“:app:LintVitalRelease”执行失败。 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。使用--scan运行以获得完整的见解。 这是我的Build.Gradle(应用程

  • 无法生成pdf下载获取Android.os.fileuriexposedexception错误:file:///storage/emulated/0/download/inv-0002.pdf通过intent.getdata()超出应用程序公开

  • 问题内容: 目前正被此错误推高。 我正在使用mongodb的mongojs包装器运行node.js应用程序。我在默认端口上启动mongod,然后运行 但是err和user都为“ null”。据我所知,err应该填充某种数据,即使找不到任何东西。 如何使回调函数正常工作?请原谅新手问题。 问题答案: 当查询找不到至少一个匹配的文档时,则将回调的第二个参数(在这种情况下)设置为。这不是错误,也是。因此