2012-08-15 61 views
0

我一直在冥思苦想,我有限的真正的编程知识,需要一些帮助......node.js中节省大量的浮点数到蒙戈搜索

从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计算器更准确:)

问题是,这个数字是目前一个字符串 - 我节省了字符串蒙戈和做一个查询,如:

{thenumber:{'$gt':'164150943396226415094339622641509433'}} 

Ie我正在比较字符串和字符串。这工作正常,因为我填充他们都一样。

的问题是 - 这是存储和搜索值或将它们转换为64位长的最好的方式(即字符串)更快的索引和搜索......

如果答案是“使用多头他们更快'我不能为我的生活(大量谷歌搜索后)找出如何将上面的字符串转换为本地Mongo Long数据类型(低位和高位) - 请帮助他的深度程序员:)

追问:

阅读Long DataType手册司机我T有这个方法:

Long.fromBits(lowBits, highBits) 

所以有针对性的问题 - 如何把一个代表64位整数到这些低和高比特龙救...也是一个字符串 - 这是更快地搜索比一个字符串?

+0

这听起来像你在为我做“真正的编程”:) – benekastah 2012-08-15 17:26:09

回答

3

使用Long.fromString将字符串转换成MongoDB中长:

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

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

+0

嘿约翰尼 - 谢谢你 - 我想它想要给高位和低位(这对于32位节点驱动程序是有意义的)... 我只是不知道如何从字符串中提取这些高位和低位... – 2012-08-15 17:34:02

+0

ahhhhh - 好的是,这个盲目地明显!谢谢我没有停下足够长的时间,认为它可能对64位来说太大了...对,我将不得不将它分开...... – 2012-08-15 23:56:31