对象 ID 中的负进程 ID



使用 java 驱动程序将一些记录添加到集合中,它将为每个记录自动生成对象 ID。在我的数据库中,它由MongoDB生成以下对象ID:

ObjectId("58b38cd57decdd8070b2df8f")

然后我对当前对象 id 进行测试:

import org.bson.types.ObjectId;
public class Test {
    public static void main(String[] args)
    { 
        // TODO Auto-generated method stub String 
        idStr = "58b38cd57decdd8070b2df8f"; 
        ObjectId id = new ObjectId(idStr);
        System.out.println(id.getProcessIdentifier()); 
    }
}

java 没有错误,打印结果如下:-32656

进程标识符是对象 ID 结构中的负数。我不确定这是 java 驱动程序错误还是核心服务器错误。

在我的项目中,我需要将对象 id 发布到 JSP 文件,并通过发布的对象结构生成对象 ID。由于进程标识符无效,JS函数生成的对象ID将包含短划线。这是一个无效的对象 ID。

发布到 JSP 文件的对象结构:

counter:11722639
date:1488162005000
machineIdentifier:8252637
processIdentifier:-32656
time:1488162005000
timeSecond:1488162005
timestamp:1488162005
对象

结构生成的新对象 ID:

58b38cd57decdd-7f90b2df8f

JS函数按对象结构生成对象ID:

function parseObjectId(objectId){
var timestamp = objectId.timestamp;
var machineIdentifier = objectId.machineIdentifier;
var processIdentifier = objectId.processIdentifier;
var counter = objectId.counter;
return toFixedLengthHex(timestamp,8) + toFixedLengthHex(machineIdentifier,6) + toFixedLengthHex(processIdentifier,4) + toFixedLengthHex(counter,6);

}

MongoDB版本:3.4.1BSON 版本:3.2.1Mongo-java-driver:3.2.2

为了解决这个问题,在将其转换为十六进制时将 65536 添加到进程标识符中,这是因为您从十六进制中获得的负值是 2 对您实际需要的补充。如果数字为负数,我只会添加该值。

var processIdentifier = objectId.processIdentifier;
if(processIdentifier < 0) processIdentifier += 65536;

相关内容

  • 没有找到相关文章

最新更新