0

我一直在努力解决我对实际编程的有限知识,需要一些帮助......

从 node.js 中并保存到 MongoDB 中(使用本机驱动程序),我需要索引和搜索一些长数字。

一个例子:

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 位 Long 的索引和搜索速度更快......

如果答案是“使用 Longs 他们更快”,我一生都无法(经过大量谷歌搜索)弄清楚如何将上面的字符串转换为原生Mongo Long数据类型(具有低位和高位) - 请帮助一个超出他深度的程序员:)

跟进:

为驱动程序阅读Long DataType手册,它具有此方法:

Long.fromBits(lowBits, highBits)

如此有针对性的问题 - 我如何将表示 64 位整数的字符串转换为这些低位和高位以便 Long 保存......另外 - 这比字符串搜索更快吗?

4

1 回答 1

3

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

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

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

于 2012-08-15T17:07:17.280 回答