1

キーフィールドとして言語コードを持つオブジェクトがたくさんあります。JavaとMongodbはどちらもUTF-8をネイティブに使用し、言語コードはASCIIであるため、文字ごとに1バイトと\0ターミネータを使用する必要があるようです。したがって、言語コード「en」は、BSONオブジェクトとインデックスで3バイトしか使用しない必要があります。

これは正しいです?フィールドを次のようなバイト配列に変換して何かを保存するかどうか疑問に思っています。

byte[] lcBytes = langCode.getBytes("ISO-8859-1");

JavaドライバーでMongodbに保存する前に?

4

1 に答える 1

3

bsonの仕様によると、違いはありません。

string  ::= int32 (byte*) "\x00"
binary  ::= int32 subtype (byte*)

つまり、文字列はゼロで終了し(したがって、1バイトを浪費します)、バイナリには1バイトのサブタイプフィールドが必要です。

もちろん、完全に一致する文字セットは、バイト配列自体を小さくできるという点でより効率的です(たとえば、頻繁に必要な文字に3バイトは必要ありませんが、1つだけです)。繰り返しになりますが、正規表現、map / reduce、js関数などを使用できなくなるため、面倒な価値はほとんどないと思います。非常にアーカンスな文字セットの場合もありますが、8859-1はそれほど特別ではありません。

補足として、インデックスのサイズは約1kに制限されているため、インデックスに非常に長い文字列をスローすることはできません(パフォーマンスの観点からはお勧めできません)。

平等でクエリするだけでよい場合は、代わりにハッシュを選択できますか?非常に大きな文字列(インデックス付けされていない)を格納する必要がある場合は、圧縮アルゴリズムを使用することをお勧めします。

于 2012-06-19T00:27:45.963 に答える