【问题标题】:Mongodb get the 3-byte counter from an ObjectIdMongodb 从 ObjectId 获取 3 字节计数器
【发布时间】:2016-08-18 12:18:30
【问题描述】:

如何/我可以得到

3字节计数器,以随机值开始

mongodb ObjectId 的一部分?

我有一个这样的 ObjectId: ObjectId("507f1f77bcf86cd799439011")

根据 mongodb 文档:

说明

ObjectId() 返回一个新的 ObjectId 值。 12 字节 ObjectId 值包括:

一个 4 字节的值,表示自 Unix 纪元以来的秒数,

一个 3 字节的机器标识符,

一个 2 字节的进程 ID,

和一个 3 字节的计数器,以随机值开头。

如果可能的话,我想从上面的 ObjectId 中获取“和一个 3 字节计数器,以随机值开头。”部分。

【问题讨论】:

  • 你能详细说明你的问题吗?

标签: javascript node.js mongodb objectid


【解决方案1】:

您可以尝试以下技巧,您可以使用 toString()toHexString() 获得 ObjectId 的等效字符串表示>,使用parseIntslice获取零件。因为十六进制数字是半个字节,所以偏移量是原来的两倍:

db.collection("collectionName").findOne({}, function(err, result) {     
    if (result) {
        var id          = result._id.toString(), ctr = 0;
        var timestamp   = parseInt(id.slice(ctr, (ctr+=8)), 16);
        var machineID   = parseInt(id.slice(ctr, (ctr+=6)), 16);
        var processID   = parseInt(id.slice(ctr, (ctr+=4)), 16);
        var counter     = parseInt(id.slice(ctr, (ctr+=6)), 16);
        console.log(id);
        console.log(timestamp);
        console.log(machineID);
        console.log(processID);
        console.log(counter);                    
    }       
});

【讨论】:

  • 用“507f1f77bcf86cd799439011”测试的结果如下:时间戳:1350508407,machineId:12384364,processID:55193,计数器:4427793 这些都很好,但时间戳 1350508407 看起来不正常。新日期(1350508407)= 1970 年 1 月 16 日星期五 16:08:28 GMT+0100(浪漫标准时间)
  • 时间戳不是毫秒,需要先乘以1000才能得到实际日期,即new Date(1350508407*1000) = Wed Oct 17 2012 22:13:27 GMT+0100 (GMT Daylight Time)
  • 根据什么对文档进行排序?我看到批量插入的数据的所有信息都相同。
  • 我将它用于计数器,但我看到不同 ID 的重复计数器。它应该是独一无二的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2021-05-09
  • 2020-06-25
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多