7

如何将 ObjectId 转换为数字?在我的应用程序中,我在客户端使用最新的猫鼬版本和骨干网。

我的问题是 ObjectId 总是被放在引号之间,这导致在我的翡翠模板和我的客户端中出现像 ""233453452534"" 这样的双引号。


编辑:

我正在查询 mongodb

this.users.find({},function(err,docs){
  cb(null,docs)
})

console.log(docs) 显示

{ name: 'test',
 _id: 5220bc207f0c866f18000001,
 __v: 0 }

在我的模板中

option(data-id=val._id) #{val.name}

我把它传给 res.render

res.render('test.jade',docs)

我的html呈现:

""5220bb43b754af4118000001""

我的对象 ID 周围有双引号。我试图在模式中设置一个数字,这很有效,如果它是一个数字,它周围没有引号,所以我猜这是因为它是一个 objectID。

4

4 回答 4

12

这是未经测试的,但我认为你想做这样的事情:

var idNum = parseInt(objectId.valueOf(), 16);

MongoDB ObjectID本质上是 12 字节的十六进制字符串。这使得它们大于MAX_VALUEJavaScript 数字 (2^53),因此您可能会在转换时遇到错误。但是,它看起来像Number.MAX_VALUE在我的 node.js 环境(0.11.6)中可以处理该值。所以你可能是安全的...

为什么要将对象 ID 转换为数字?你真的不应该对 ObjectId 执行算术运算......

于 2013-08-31T06:37:17.953 回答
7

我假设您希望对象的唯一 id 作为整数/数字(有时只是最终用户易于使用的小整数)。我对票号有相同的用例。有时您希望最终用户能够直接引用记录 ID,但没有那些时髦的字符。因此,人们可能真的想将其转换为一个简单的整数,例如:000001 而不是 5220bb43b754af4118000001。

在这里,我主要是在回答问题的标题以帮助我和其他人,我希望它能回答整个问题。

实际上对于上述用例或大多数情况,您不需要转换整个对象 id:

根据这个https://devopslog.wordpress.com/2012/04/22/disassemblereassemble-mongodb-objectids/

timestamp → Generation timestamp (4 bytes)
machine → First 3 bytes of the MD5 hash of the machine host name, or of the mac/network address, or the virtual machine id.
pid → First 2 bytes of the process (or thread) ID generating the ObjectId.
inc → ever incrementing integer value.

在字符中,这转化为:

timestamp → 0-7
machine → 8-13
pid → 14-17
inc → 18-23

意思是:

“5220bb43b754af4118000001”

分解为:

timestamp → 5220bb43
machine → b754af
pid → 4118
inc → 000001

您可能只需要 id 的 inc 部分或至少需要时间戳和 inc。

let objID = "5220bb43b754af4118000001";
let id = objID.substr(18);
console.log(id);
// 000001
// if parsed to int this becomes 1

希望这可以帮助某人。

于 2019-09-20T07:49:40.817 回答
3

尝试使用虚拟 id 而不是 _id

option(data-id=val.id) #{val.name}

代替

option(data-id=val._id) #{val.name}
于 2013-08-31T13:21:07.500 回答
1

写作以防您使用猫鼬以外的东西遇到同样的问题:我在使用 mongoskin 时遇到了同样的问题。

在将 mongo _id 渲染为 HTML 属性时,Jade 不知何故吓坏了。

对我来说,解决方案是这样的:

// instead of

option(data-id=val._id)

// try

option(data-id="#{val._id}")
于 2014-06-19T05:29:56.290 回答