0

私は mongdb にいくつかの非常に大きな整数 (10 進数で数千桁) を格納したいと考えています。もちろん、これは BSON でサポートされている標準型では機能しません。また、範囲検索などを実行したいことを考慮して、最もエレガントな回避策を考えようとしています。この要件により、整数を文字列として格納することは除外されます。これは、範囲検索が実用的でなくなるためです。

私が考えることができる 1 つの方法は、標準 int の (可変長) 配列を使用して 2^32 展開をエンコードし、この配列に配列自体の長さの最初のエントリを追加することです。このように、これらの配列の辞書式順序付けは、任意の大きな整数の通常の順序付けに対応します。

たとえば、コレクションには 5 つのドキュメントを含めることができます

{"name": "me", "fortune": [1,1000]}
{"name": "scrooge mcduck", "fortune": [11,1,0,0,0,0,0,0,0,0,0,0]}
{"name": "bruce wayne","fortune": [2, 10,0]}
{"name": "bill gates", "fortune": [2,1,1000]}
{"name": "francis", "fortune": [0]}

したがって、ブルース ウェインの純資産は 10*2^32、ビル ゲイツの純資産は 2^32+1000、スクルージ マクダックの純資産は 2^320 です。

次に、{"fortune":1} を使用して並べ替えを行うと、私のマシン (pymongo を使用) では、予想どおり、フランシス < 私 < ビル < ブルース < スクルージの順序でそれらを返します。

ただし、BSON 配列の比較方法についてどこにも文書化されていないことを前提としており、範囲検索は私の考えどおりには機能しないようです (たとえば、

find({"fortune":{$gte:[2,5,0]}}) 

ドキュメントは返されませんが、ブルースとスクルージが欲しいと思います)。

誰でも私を助けることができますか?ありがとう

4

2 に答える 2

0

残念ながら、配列比較に関するあなたの仮定は正しくありません。たとえば、3 より小さいすべての配列値 ({array:{$lt:3}}) を照会する範囲クエリは、要素の位置に関係なく、少なくとも 1 つの要素が 3 未満であるすべての配列を返します。そのため、あなたのアプローチは機能しません。

何が機能しますが、少し明白ではありませんが、バイトオーダーで比較されるため、非常に大きな整数にバイナリブロブを使用することです。これには、整数の上限ビット制限を設定する必要がありますが、それはかなり簡単なはずです。BinData(subType, base64) 表記を使用して、シェルでテストできます。

db.col.find({fortune:{$gt:BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=")}})

したがって、大きな整数を、たとえば文字列から 2 の補数のバイナリに変換するメソッドを作成するだけで済みます。幸運を

于 2012-04-13T08:18:19.523 に答える