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

标签 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)));

在这里,变量 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 不会对引号进行转义并且查询有效。


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

感谢大家的阅读!

最佳答案

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

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

关于java - 如何防止 Java 的 Mongo 驱动程序转义查询中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646139/

相关文章:

java - 在后 Java 世界中,Linux 上 SOA 的最佳语言/平台是什么?

java - 如何为 App Engine 运行负载平衡?

javascript - 每个第二个逗号后分隔数组

javascript - "NULL"值被添加到 localStorage 数组中

ios - 如何在给定第二个数组的情况下找到某个值的位置?

python - 如何读取 Pandas 数据框中的 JSON 对象

java - JMenu 不会出现在我的 jFrame 中

java - Ant javac : package does not exist

ajax - AJAX使Chrome崩溃

php - 从 json 字符串中提取数据返回错误