4

案子

所以我正在尝试使用 Java 对 Mongo 数据库执行查询。在 shell 中,我正在谈论的查询如下所示:

db.myCollection.find({ "array" : { "$in" : [ "foo" , "bar" ]}});

查询在 Java 中组合在一起,如下所示:

DBCursor cursor = myCollection.find(new BasicDBObject("array", new BasicDBObject("$in", items)));

在这里,变量items被定义为一个 String[],它是从其他地方传递的。它可以保存任何值,但在此示例中,它包含以下元素:

"foo", "bar";

问题

这就是问题开始的地方。打电话

cursor.getQuery()

返回

{ "array" : { "$in" : [ "\"foo\"" , "\"bar\"" ]}}

这不会返回任何结果。如您所见,Java 的 Mongo 驱动程序添加了引号并将其转义。

我试过了

  1. 复制数组,并确保所有内容都被修剪掉。然后将其传递给查询。

    String[] test = new String[items.length];
    for(int i = 0; i < items.length; i++){
        test[i] = items[i].trim();
    }
    

    没用。

  2. 现在这里有一些真正的魔法给你们!我尝试在查询之前初始化字符串,如下所示:

    String[] items = new String[]{ "foo", "bar" };
    

    当我这样初始化它时,Mongo 不会转义引号并且查询有效。


所以我想知道这是什么诡计。以及我该如何解决这个问题。

谢谢大家的阅读!

4

2 回答 2

3

您不应试图阻止 Mongo 驱动程序转义字符串文字。转义是为了确保最终的 json 或 bson 在语法上是正确的。AFAIK,不可能改变 Mongo 驱动程序如何格式化最终消息到服务器,这是合理的,因为它正确实现了服务器协议。

在您的特定情况下,您的意图是使用字符串文字fooand bar,但您的数据包含文字"foo""bar"而是导致您观察到的逻辑问题。

于 2013-10-31T08:52:27.540 回答
0

接受的答案是正确的,

对于我应用以下技巧的类似情况,如果有人需要引用表达式的解决方案,我将低于我的解决方案。

BasicDBObject objectJsonKey = BasicDBObject.parse(quotedStrKey);
BasicDBObject filterCondition = new BasicDBObject("_id", objectJsonKey);

quotedStrKey_id是我的带双引号的复合 json 对象"

于 2021-10-19T17:11:01.117 回答