如何防止Java的Mongo驱动程序在查询中转义引号

时间:2013-10-28 22:20:11

标签: java arrays json mongodb escaping

案例

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

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

将查询放在Java中,如下所示:

DBCursor cursor = myCollection.find(new BasicDBObject("array", new BasicDBObject("$in", 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不会转义引号并且查询有效。


  3. 所以我想知道这是什么样的诡计。我怎么能解决这个问题。

    谢谢大家的阅读!

1 个答案:

答案 0 :(得分:3)

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

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