用Java构建MongoDB查询

时间:2016-03-07 12:38:47

标签: java mongodb

这是在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));并且它按预期工作。

1 个答案:

答案 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