0

私は実際のプログラミングについての限られた知識と格闘してきましたが、助けが必要です...

node.js内から(ネイティブドライバーを使用して)MongoDBに保存するために、いくつかの長い数値にインデックスを付けて検索する必要があります。

例:

87 / 53

64ビットWindows電卓では、これは次のとおりです。

1.6415094339622641509433962264151

私はこれをnode.jsで実行します:

var answer = 87 / 53;
console.log(answer);

そして私は得る:

1.6415094339622642

私の理解では、node.jsは32ビットしか実行されないため、必要な精度が得られません。

そこで、libgmpをラップするnode-bigintライブラリを接続して、文字列を使用して大きな数の計算を実行しました...

今では:

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データ型(下位ビットと上位ビット)に変換する方法を理解できません-お願いします彼の深みのあるプログラマーを助けてください:)

ファローアップ:

ドライバーのLongDataTypeマニュアルを読むと、次の方法があります。

Long.fromBits(lowBits, highBits)

したがって、対象を絞った質問-64ビット整数を表す文字列をこれらの下位ビットと上位ビットに変換してLongを保存するにはどうすればよいですか...また-これは文字列よりも検索が高速ですか?

4

1 に答える 1

3

Long.fromString文字列をMongoDBLongに変換するために使用します。

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

2番目の編集-実際、これ符号付き64ビット整数を含む文字列に対する正しい答えです。問題は、の文字​​列'164150943396226415094339622641509433'が大きすぎて64ビットの符号付き整数として格納できないことです。使用できる最大値は(2 ^ 63-1)または9223372036854775807です。

于 2012-08-15T17:07:17.280 に答える