0

MongoDB コレクションにバイナリ データを保持する必要があります。C++ ドライバーまたは Java ドライバーを使用して同じレコードを取得すると、ドキュメントの JSON 表現が異なるようです。ここに例があります。Mongo シェルを使用して MongoDB コレクションに 3 つのレコードを挿入します。

db.binary_test.insert({"name":"Alex", "data" :BinData("0x00", "12345678")})
db.binary_test.insert({"name":"Alex", "data" :BinData("0x80", "12345678")}) 

最初のレコードは、バイナリ タイプ 0x00 (ジェネリック) を使用します。2 番目 - 0x80 (ユーザー定義)。

Mongo Shell を使用してこれらのレコードを取得します。

db.binary_test.find().pretty()

出力:

{
    "_id" : ObjectId("51acf66886174308b610d950"),
    "name" : "Alex",
    "data" : BinData(0,"12345678")
}
{
    "_id" : ObjectId("51acf66c86174308b610d951"),
    "name" : "Alex",
    "data" : BinData(128,"12345678")
}

タグは 16 進文字列ではなく、数値で表されることに注意してください。

非常に単純な Java プログラムを使用して同じレコードを取得し、strict シリアライザーを使用してそれらを JSON に変換します。

ObjectSerializer serializer = JSONSerializers.getStrict();
System.out.println(serializer.serialize(doc));

出力は次のとおりです。

{ "_id" : { "$oid" : "51acf66886174308b610d950"} , "name" : "Alex" , "data" : { "$binary" : "12345678" , "$type" : 0}}
{ "_id" : { "$oid" : "51acf66c86174308b610d951"} , "name" : "Alex" , "data" : { "$binary" : "12345678" , "$type" : -128}}

バイナリ データ型は、16 進文字列ではなく整数として表されることに注意してください。

比較のために、MongoDB C++ ドライバーを使用して同じ 2 つのレコードを取得し、jsonString()メソッドを使用してそれらを出力します。出力は次のとおりです。

{ "_id" : { "$oid" : "51acf66886174308b610d950" }, "name" : "Alex", "data" : { "$binary" : "12345678", "$type" : "00" } }
{ "_id" : { "$oid" : "51acf66c86174308b610d951" }, "name" : "Alex", "data" : { "$binary" : "12345678", "$type" : "80" } }

現在、タイプは数値ではなく 16 進文字列です。

したがって、同じレコードでも、C++ ドライバーを使用して取得したか、Java ドライバーを使用して取得したかによって、JSON 表現が異なります。一部のソフトウェアが Java ドライバーを使用し、一部のソフトウェアが C++ ドライバーを使用する場合、この不一致により混合環境で問題が発生します。問題を解決するための提案はありますか (ドライバー コードを変更する以外に)? 型を 16 進文字列で表す C++ ドライバーと、Java ドライバーのどちらが正しいのでしょうか。私の理解では、C++ ドライバーによって返される表現は正しいですが、誰かがこれを確認できますか?

MongoDB http インターフェイスも 16 進文字列表現を返します。これはおそらく、REST インターフェイス (mongod) をサポートするバックエンドが C++ で記述されているためです。

Java ドライバー バージョン 2.11.1 と C++ ドライバー バージョン 2.4.3 を使用しています。

4

2 に答える 2

0

ここに違いはありません。データは同じですが、人間が読めるようにするフォーマッターのみが異なる形式で表示されます。

jsonString()[...]メソッドを使用してそれらを印刷します

これがポイントです。フォーマットされた出力を見ると、「0x80」、「80」、128、および -128すべて同じことを意味します。データは常に何らかの規則に従って解釈されます。「0x80」の場合、「0x」プレフィックスは、16 進表記を示すためのある程度普及した規則です。byte「80」は、データが 16 進文字列として解釈され、1000000 のバイナリ値に対応することを知っている必要があります。これは、整数の場合、10 進値の 128 に等しくなります。-128に。

コードは書式設定された出力を参照するのではなく、 などの明確に定義された型を持つフィールドまたはプロパティと比較する必要がありますint。次に、書くことができます

if(a.Type == 128) { ... }

プログラミング言語のフォーマッターが何を出力するかに関係なく、正しい値に対して true と評価される必要があります。(a.Typeがの場合、 byte-128 と比較する必要があります。ほとんどのプログラミング言語では、128 と比較すると、警告またはエラーが発生します。128 は、表現可能な最大の符号付き 8 ビット値 (バイト) よりも大きいためです)。

ところで、オブジェクト ID の表現を見ると、さまざまな書式設定がさらに印象的です。mongo コンソールでは として表示されObjectId("51acf66886174308b610d950")、C++ json フォーマッタは を表示します"_id" : {"$oid" : "51acf66886174308b610d950"}。繰り返しますが、同じデータですが、ここでは文字列は同じように見えますが、その周りの足場は異なって見えます。

于 2013-06-04T14:47:31.113 に答える
0

これはJava ドライバーのバグです。

于 2013-06-06T22:29:41.543 に答える