查询二进制数据 - MongoDB

Dis*_*ana 6 java mongodb

我在我的应用程序中使用 Java Driver for MongoDB (2.14)。
我有这些文件:

{ "_id" : ObjectId("56fb9798e2445ade35effa89"), "b" : BinData(3,"abcdefgh") }
{ "_id" : ObjectId("56fba265e2445ade35effa8c"), "b" : 1 }
Run Code Online (Sandbox Code Playgroud)

我必须"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);
Run Code Online (Sandbox Code Playgroud)

但是当我开始迭代时,cursor我得到一个异常:

java.lang.IllegalArgumentException: 错误的数据大小子类型 3 len: 6 != 16

当我尝试使用 mongo shell 进行相同的查询时,即:

db.coll.find({b:{"$type":5}}, {_id:0,b:1})
Run Code Online (Sandbox Code Playgroud)

我没有错误。

Bla*_*ven 7

二进制子类型 3 是为 UUID 保留的,它具有“严格”的 16 字节长度(十六进制表示法中的 32 个字符串元素)。因此,您在 Java 代码中遇到了错误。

MongoDB shell 没有这种“严格”类型,因此两者都允许创建和读取数据。MongoDB 本身也不是“严格类型”的,因此就引擎而言,它只是 BSON 类型 5,并没有进一步研究它。

如果您插入的文档要么使用正确的数据作为子类型:

{ "b": BinData(3,"ASNFZ4mrze/+3LqYdlQyEA==") }
Run Code Online (Sandbox Code Playgroud)

或者适合数据的更正子类型,例如0

{ "b": BinDta(0,"abcdefgh") }
Run Code Online (Sandbox Code Playgroud)

那么Java驱动程序在编组到它的Binary类型时没有问题。

所以你得到错误是因为你的“数据”是“无效的”。更正数据,没有问题。