我一直在努力学习有限的真正编程知识并需要一些帮助......
从node.js内部保存到MongoDB(使用native driver)我需要索引并搜索一些长数字。
一个例子:
87 / 53
在64位Windows计算器上,这是:
1.6415094339622641509433962264151
我在node.js中运行它:
var answer = 87 / 53;
console.log(answer);
我得到了:
1.6415094339622642
我的理解是因为node.js只运行32位,我们无法获得所需的精度。
所以,我插入了node-bigint库包装了libgmp来使用字符串进行大数学运算......
现在是:
var bigint = require('bigint');
var top = bigint('8700000000000000000000000000000000000');
var bottom = bigint(53);
var answer = top.div(bottom);
console.log(answer.toString());
我用零填充以移除浮点(更容易 - 我只需要比较数字,即大于小于...)
此代码产生:
'164150943396226415094339622641509433'
太棒了 - 我比Windows计算器更准确了:)
问题是,这个数字目前是一个字符串 - 我将字符串保存到Mongo并进行如下查询:
{thenumber:{'$gt':'164150943396226415094339622641509433'}}
即。我将字符串与字符串进行比较。这样做很好,因为我已经将它们全部填充了。
问题是 - 这是存储和搜索值的最佳方式(即字符串),还是将它们转换为64位长的索引和搜索更快...
如果答案是'使用Longs,他们会更快'我不能为我的生活(经过大量的谷歌搜索)弄清楚如何将上面的字符串转换为本地Mongo Long数据类型(低位和高位) - 请帮助他的深度程序员:)
跟进:
阅读驱动程序的Long DataType手册,它有这个方法:
Long.fromBits(lowBits, highBits)
如此有针对性的问题 - 如何将表示64位整数的字符串转换为Long的这些低位和高位以保存...另外 - 搜索比字符串更快吗?
答案 0 :(得分:3)
使用Long.fromString
将字符串转换为MongoDB Long:
var Long = require('mongodb').Long;
var long = Long.fromString(str, 10);
第二次编辑 - 实际上, 是包含带符号64位整数的字符串的正确答案。问题是您的'164150943396226415094339622641509433'
字符串太大而无法存储为64位有符号整数。您可以使用的最大值是(2 ^ 63 - 1)或9223372036854775807.。