我参与了一个项目,我们使用 MongoDB 作为主要数据库系统,并使用 JavaScript/NodeJS 作为服务器端。我们需要与外部合作伙伴进行集成。
我们合作伙伴的 API 要求操作编号应该是唯一的整数值。我们决定结合使用来自 ObjectId
的 4 字节时间戳和 3 字节随机增量值,但结果数字太高,我们失去了精度。
这是程序
var getUniqueIntFromObjectId = function (object_id) {
var res = null;
object_id = object_id.toString();
res = parseInt(object_id.substring(0, 8), 16).toString() + parseInt(object_id.substring(18, 24), 16).toString();
return parseInt(res, 10);
};
我们如何改进这个过程,或者改变它来实现目标?
最佳答案
您可以通过选择一个初始 ObjectId(表中最旧的)来获得一个有效整数,并使用它来偏移前 4 个字节中的时间戳。这会给你一个更小的数字,它是一个有效的整数而不会失去唯一性。或者,您可以将初始 ObjectId 设置为 500000000000000000000000
,对应于 2012-07-13T11:01:20.000Z
var getUniqueIntFromObjectId = function (object_id) {
var res = null;
object_id = object_id.toString();
var firstObjectId='5661728913124370191fa3f8'
var delta = parseInt(object_id.substring(0, 8), 16)-parseInt(firstObjectId.substring(0, 8),16)
res = delta.toString() + parseInt(object_id.substring(18, 24), 16).toString();
return parseInt(res, 10);
};
document.write("Unique integer: <br>" + getUniqueIntFromObjectId("56618f7d0000000000000000"))
document.write('<br/>')
document.write("Max safe integer: <br>"+Number.MAX_SAFE_INTEGER)
关于javascript - 在 JavaScript(NodeJS)中从 MongoDB ObjectId 获取唯一的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34087846/