所以我正在尝试使用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驱动程序添加了引号并将其转义。
复制阵列,并确保修剪掉所有内容。然后将其传递给查询。
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不会转义引号并且查询有效。
所以我想知道这是什么样的诡计。我怎么能解决这个问题。
谢谢大家的阅读!
答案 0 :(得分:3)
您不应该尝试阻止Mongo驱动程序转义字符串文字。进行转义以确保最终的json或bson在语法上是正确的。 AFAIK,不可能改变Mongo驱动程序如何将最终消息格式化到服务器,这是合理的,因为它正确地实现了服务器协议。
在您的特定情况下,您的意图是使用字符串文字foo
和bar
,但您的数据包含文字"foo"
和"bar"
,导致逻辑问题正在观察。