我需要在我的 MongoDB 集合中保留一些二进制数据。在使用 C++ 驱动程序或 Java 驱动程序检索相同记录时,似乎我的文档得到了不同的 JSON 表示。这是一个例子。使用 Mongo shell 在 MongoDB 集合中插入三条记录:
db.binary_test.insert({"name":"Alex", "data" :BinData("0x00", "12345678")})
db.binary_test.insert({"name":"Alex", "data" :BinData("0x80", "12345678")})
第一条记录使用二进制类型 0x00(通用);第二个 - 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")
}
请注意,标签表示为数字,而不是十六进制字符串。
现在使用一个非常简单的 Java 程序检索相同的记录,并使用严格的序列化程序将它们转换为 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}}
请注意,二进制数据类型表示为整数,而不是十六进制字符串。
现在为了比较使用 MongoDB C++ 驱动程序来检索相同的两条记录并使用该jsonString()
方法打印它们。这是输出:
{ "_id" : { "$oid" : "51acf66886174308b610d950" }, "name" : "Alex", "data" : { "$binary" : "12345678", "$type" : "00" } }
{ "_id" : { "$oid" : "51acf66c86174308b610d951" }, "name" : "Alex", "data" : { "$binary" : "12345678", "$type" : "80" } }
现在类型是十六进制字符串,而不是数字。
因此,同一记录具有不同的 JSON 表示,具体取决于它是使用 C++ 驱动程序还是 Java 驱动程序检索的。当一些软件使用 Java 驱动程序而一些软件使用 C++ 驱动程序时,这种差异会在混合环境中产生问题。有什么建议如何解决问题(除了更改驱动程序代码)?哪一个是正确的 - 将类型表示为十六进制字符串的 C++ 驱动程序,还是 Java 驱动程序?我的理解是 C++ 驱动程序返回的表示是正确的,但有人可以证实这一点吗?
MongoDB http 接口还返回十六进制字符串表示 - 可能是因为支持 REST 接口 (mongod) 的后端是用 C++ 编写的。
我正在使用 Java 驱动程序版本 2.11.1 和 C++ 驱动程序版本 2.4.3。