【问题标题】:Query for binary data - MongoDB查询二进制数据 - MongoDB
【发布时间】:2016-03-30 10:04:20
【问题描述】:

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

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

我必须使用 Java 检索所有 "b" 是二进制数据的文档。 为了达到我的目标,我使用以下查询:

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

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

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

我没有错误。

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

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

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

    如果您插入了文档,请使用正确的子类型数据:

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

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

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

    那么Java驱动编组到Binary类型时就没有问题了。

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

    【讨论】:

    • 谢谢你,很好的解释。
    猜你喜欢
    • 2019-12-17
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多