这是在mongo shell中运行的查询,我试图在Java中动态重新创建:
db.contacts.find(
{
$and: [
{"site" : { $in : ["FR", "NL"] }},
{"country" : {$in : ["Belgium"]}}
]
}
);
我的网站和国家/地区的值已存储在String[]
中,如此:
String[] sites = {"NL", "FR"};
String[] countries = {"Belgium"};
我的查询构建器如下所示:
Document query = new Document();
Document st = new Document();
Document ct = new Document();
List<Document> lst = new ArrayList<>();
if(sites != null){
st.put("site", new Document("$in", Arrays.asList(sites)));
lst.add(st);
}
if(countries != null){
ct.put("country", new Document("$in", Arrays.asList(countries)));
lst.add(ct);
}
query.put("$and", lst);
当我打印查询时,这就是我得到的:
Document{{$and=[
Document{{site=Document{{$in=[NL, FR]}}}},
Document{{country=Document{{$in=[Belgium]}}}}
]}}
但是这个查询没有返回任何结果,而我粘贴在顶部的那个工作正常。
如果我像这样运行查询:
Document{{$and=[Document{{site=Document{{$in=[NL, FR]}}}}]}}
它只返回NL标记为site的文档,但不返回FR,反之亦然FR是在数组中的NL之前,它只返回FR而不是NL文档。
编辑:我明白了!基本上它不喜欢转换Arrays.asList(sites)
,我不得不像这样初始化新的List:List<String> list = new ArrayList<>(Arrays.asList(sites));
并且它按预期工作。
答案 0 :(得分:0)
您可以尝试为这两个过滤器重复使用相同的对象吗?以下是一个例子:
BasicDBObject whereCondition = new BasicDBObject();
whereCondition.put("site", new BasicDBObject("$in", Arrays.asList(sites)));
whereCondition.put("country", new BasicDBObject("$in", Arrays.asList(countries)));
//execute the query