2016-08-18 69 views
2

如何/我可以得到的MongoDB从的ObjectId获得3个字节的计数器

3个字节的计数器,开始从MongoDB中的ObjectId随机值

一部分?

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

据MongoDB的文档:

说明

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

自Unix纪元表示秒的4字节的值,

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

的2字节的进程id ,

和一个3字节计数器,从一个随机值开始。

我想要得到的“和3个字节的计数器,从一个随机值。”以上,如果可能部分来自的ObjectId。

+0

可以详细说明您的问题吗? – rummykhan

回答

3

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

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);      
    }  
}); 
+0

与测试 “507f1f77bcf86cd799439011” 这里的结果: 时间戳:1350508407, 设备ID:12384364, 的ProcessID:55193, 计数器:4427793 这些都是好的,但时间戳1350508407看起来并不确定。 新日期(1350508407)=周五1970年1月16日16:08:28 GMT + 0100(浪漫标准时间) – kailniris

+1

时间戳不是以毫秒为单位,您需要先乘以1000以获取实际日期,即'new Date(1350508407 * 1000)= Wed Oct 17 2012 22:13:27 GMT + 0100(GMT Daylight Time)' – chridam