使用 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;