案例
所以我尝试使用 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 驱动程序添加了引号并对其进行了转义。
我试过了
复制数组,并确保所有内容都被修剪掉。然后将其传递给查询。
String[] test = new String[items.length]; for(int i = 0; i < items.length; i++){ test[i] = items[i].trim(); }
没用。
现在给大家带来一些真正的魔法!我尝试在查询之前初始化字符串,如下所示:
String[] items = new String[]{ "foo", "bar" };
当我这样初始化它时,Mongo 不会对引号进行转义并且查询有效。
所以我想知道这是什么样的诡计。以及我如何解决这个问题。
感谢大家的阅读!
最佳答案
您不应该试图阻止 Mongo 驱动程序转义字符串文字。转义是为了确保最终的 json 或 bson 在语法上是正确的。 AFAIK,不可能改变 Mongo 驱动程序如何格式化发送到服务器的最终消息,这是合理的,因为它正确地实现了服务器协议(protocol)。
在您的特定情况下,您的意图是使用字符串文字 foo
和 bar
,但您的数据包含文字 "foo"
和 "bar"
而不是,导致您观察到的逻辑问题。
关于java - 如何防止 Java 的 Mongo 驱动程序转义查询中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646139/