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 を使用しています。