2016-03-30 14 views
4

私のアプリケーションでMongoDB(2.14)用のJavaドライバを使用しています。バイナリデータのクエリ - MongoDB

{ "_id" : ObjectId("56fb9798e2445ade35effa89"), "b" : BinData(3,"abcdefgh") } 
{ "_id" : ObjectId("56fba265e2445ade35effa8c"), "b" : 1 } 

私は"b"は、Javaを使用してバイナリデータであり、すべてのドキュメントを取得する必要があります。
私はこれらの文書を持っています。

DBObject query = new BasicDBObject(b, new BasicDBObject("$type",5)); 
DBObject projKeys = new BasicDBObject(); 
projKeys.put("_id", 0); 
projKeys.put(b, 1); 

DBCursor cursor = coll.find(query,projKeys); 

しかし、私はcursorを反復するために起動したとき、私は例外を取得:

java.lang.IllegalArgumentExceptionが:悪いデータサイズサブタイプ3 LEN:私は次のクエリを使用して、私の目標に到達するために !6 = 16

私はモンゴシェルを使用して、同じクエリをしようと、それは次のようになります。

db.coll.find({b:{"$type":5}}, {_id:0,b:1}) 

私はこのエラーはありません。

答えて

3

バイナリサブタイプ3は、「厳密な」16バイト長(32文字の16進数表記の要素)を持つUUID用に予約されています。そのため、Javaコードでエラーが発生しています。

MongoDBシェルにはこの「厳密な」型指定がありません。そのため、両方ともデータの作成と読み取りが可能です。 MongoDB自体も「厳密に型指定されていません」というわけではありません。エンジンに関しては、BSON Type 5だけであり、それ以上は見ていません。

あなたは、サブタイプのために正しいデータを使用するか、文書を挿入した場合:

{ "b": BinData(3,"ASNFZ4mrze/+3LqYdlQyEA==") } 

やデータに合った修正サブタイプは、そのような0を:

{ "b": BinDta(0,"abcdefgh") } 

次にJavaドライバは問題がありませんそれにマーシャリングするときBinaryタイプです。

「データ」が「無効」なので、エラーが表示されます。データを修正しても問題はありません。

+0

ありがとう、素晴らしい説明。 – DistribuzioneGaussiana