1

Perl (MongoDb を使用) と mongoinsert からデータを挿入する mongo のコレクションがあります。問題は、数値のデータ型が一貫しなくなることです。

たとえば、Perl から次のようにします。

$collection->insert({ _id => 1, value => "record 1" });

そして、mongoimport でインポートする JSON ファイルがあり、次の行が含まれています。

{"_id":2,"value":"record 2"}

コレクションを検索すると、次のようになります。

> db.test.find()
{ "_id" : NumberLong(1), "value" : "record 1" }
{ "_id" : 2, "value" : "record 2" }

Perl ドライバーに _id を 32 ビットの数値として強制的に挿入させる方法はありますか? またはmongoimportを強制して、64ビット(NumberLong)として書き込むには?

_id フィールドの一貫性を保つ方法について他に提案はありますか?

4

1 に答える 1

2

MongoDB Perl モジュールのドキュメントには、64 ビット整数に関する情報がいくつかあります: http://search.cpan.org/dist/MongoDB/lib/MongoDB/DataTypes.pod#64-bit_Platforms

整数サイズの違いは、使用している言語とドライバーによって異なります。Perl、PHP、Python などの動的型付け言語は、64 ビット用にコンパイルされた場合は 64 ビット整数を使用し、32 ビット用にコンパイルされた場合は 32 ビット整数を使用します。Java のような静的に型付けされた言語はより具体的かもしれませんが (Int は常に 32 ビットです)、C のような一部の言語では、int が少なくとも 16 ビットであること (および long は int よりも大きく、少なくとも 32 ビットであること) しか保証されません。 )。

シェル クエリに表示される NumberLong _ids は、64 ビット Perl (64 ビット整数を使用) を使用してデータを挿入しているため、予期されたものです。32 ビット整数は実際には NumberInt 形式ですが、シェルはこれらの型を明示的に表示しません。

インデックス作成とクエリが適用される限り、数値の _id は一意である必要があります。

たとえば、32 ビットと 64 ビットの両方に同じ整数 _id を挿入しようとすると、重複キー エラーが発生します。

MongoDB shell version: 2.0.6
>     db.ints.insert({ _id: NumberInt(1) });
>     db.ints.insert({ _id: NumberLong(1) });
E11000 duplicate key error index: testing.ints.$_id_  dup key: { : 1 }

同様に、数値の _id を照会すると、次のように一致します。

>     db.ints.insert({ _id: NumberLong(2) });
>     db.ints.find({_id:Number(2)});
{ "_id" : NumberLong(2) }

>     db.ints.insert({ _id: NumberLong(3) });
>     db.ints.find({_id:Number(3)});
{ "_id" : NumberLong(3) }

さまざまなドライバーや mongoimport などのコマンドを使用した場合の整数サイズの違いが気になる場合は、独自のインポート スクリプトを作成できます。mongoimport に相当するものは、 Text::CSV_XSを使用してすばやくまとめることができます。

于 2012-06-28T04:23:50.200 に答える