【问题标题】:mongoose objectid to number猫鼬对象编号
【发布时间】:2019-09-20 15:49:40
【问题描述】:

如何将 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。

【问题讨论】:

  • 您需要展示更多问题所在。报价从何而来?为什么要将其转换为数字?

标签: node.js backbone.js express mongoose


【解决方案1】:

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

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

MongoDB ObjectIDs 本质上是 12 字节的十六进制字符串。这使得它们比 JavaScript 编号 (2^53) 的 MAX_VALUE 更大,因此您可能会在转换时遇到错误。 但是,我的 node.js 环境 (0.11.6) 中的 Number.MAX_VALUE 似乎可以处理该值。所以你可能是安全的......

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

【讨论】:

  • 我无法取回我“投射”到 ObjectId 中的整数。 id = mongoose.Types.ObjectId(123); parseInt(id.valueOf(), 16); 不给我 123。
  • 这绝对比创建一个额外的索引和搞乱“pre”保存和其他东西更容易。虽然我不知道采取这个然后抵消它是否是一个好方法,所以你在第一个项目上得到零。
【解决方案2】:

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

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

其实对于上述用例或者大部分你不需要转换整个对象id:

据此https://devopslog.wordpress.com/2012/04/22/disassemblingreassembling-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

希望这对某人有所帮助。

【讨论】:

    【解决方案3】:

    尝试使用虚拟 id 代替 _id

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

    而不是

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

    【讨论】:

      【解决方案4】:

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

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

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

      // instead of
      
      option(data-id=val._id)
      
      // try
      
      option(data-id="#{val._id}")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2018-06-23
        • 2015-12-28
        相关资源
        最近更新 更多