node.js将大浮点数保存到mongo中进行搜索

时间:2012-08-15 16:34:26

标签: node.js mongodb

我一直在努力学习有限的真正编程知识并需要一些帮助......

从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的这些低位和高位以保存...另外 - 搜索比字符串更快吗?

1 个答案:

答案 0 :(得分:3)

使用Long.fromString将字符串转换为MongoDB Long:

var Long = require('mongodb').Long;
var long = Long.fromString(str, 10);

第二次编辑 - 实际上, 是包含带符号64位整数的字符串的正确答案。问题是您的'164150943396226415094339622641509433'字符串太大而无法存储为64位有符号整数。您可以使用的最大值是(2 ^ 63 - 1)或9223372036854775807.。