从ObjectId中获取3字节计数器的Mongodb方法

10

我如何从mongodb的ObjectId中获取以随机值开头的3字节计数器部分?

我有一个类似这样的ObjectId:

ObjectId("507f1f77bcf86cd799439011")

根据mongodb文档:

描述

ObjectId() 返回一个新的ObjectId值。这个12字节的 ObjectId值由以下内容组成:

一个表示Unix纪元后的秒数的4字节值,

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

一个2字节的进程id,

以随机值开头的3字节计数器。

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


请问您能详细说明一下您的问题吗? - rummykhan
1个回答

12
你可以尝试以下的技巧,使用 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, 机器ID:12384364, 进程ID:55193, 计数器:4427793。这些都很好,但时间戳1350508407看起来不对。 new Date(1350508407) = Fri Jan 16 1970 16:08:28 GMT+0100 (Romance Standard Time) - kailniris
2
时间戳不是以毫秒为单位的,您需要先乘以1000才能得到实际日期,例如 new Date(1350508407*1000) = Wed Oct 17 2012 22:13:27 GMT+0100 (GMT Daylight Time) - chridam
文档按照什么基础排序?我看到批量插入的数据所有信息都是相同的。 - Akshay Naik
1
我正在使用这个计数器,但是我发现不同ID的计数器出现了重复。它应该是唯一的吗? - Stephen Romero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接