我该如何使用Java驱动程序构建MongoDB的$or查询?

39

我正在尝试在MongoDB中对一些条件进行或运算(使用Java驱动程序)。 这是我正在做的:

Pattern regex = Pattern.compile("title");   
DBCollection coll = MongoDBUtil.getDB().getCollection("post_details");

BasicDBObject query = new BasicDBObject();
query.put("category_title", "myCategory");      
query.append("post_title", regex);  
query.append("post_description", regex);    

DBCursor cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next().get("post_id"));
}

我想在这些条件中使用$or运算符,但我猜默认是“and”,我不知道如何改变它。如果上述代码中的某个条件返回null,则结果也将是null


'code' query.append("$or", new BasicDBObject().append("post_title", regex).append("post_description", regex)) - Ravi Khakhkhar
这看起来不对。$or子句应该被一个数组而不是一个对象包裹。 - Remon van Vliet
各位大侠,请回答我的问题:http://stackoverflow.com/questions/38115986/writing-mongodb-syntax 我需要你们的帮助 >_< - beboy
2个回答

74

您说得对,在查询中指定多个字段的“默认”方式是,每个字段都作为条件过滤器,因此是AND操作。

您可以使用$or操作符执行带OR子句的MongoDB查询,其语法如下:

db.col.find({$or:[clause1, clause2]})

每个条件子句都可以是一个查询。$or 不一定要是顶层操作数,但如果它是,MongoDB 可以为每个单独的子句使用一个索引。

在你的例子中,你希望最终得到这个查询:

db.col.find({$or:[{"post_title", regex}, {"post_description", regex}]});  

可以通过以下方式在Java中构建:

DBObject clause1 = new BasicDBObject("post_title", regex);  
DBObject clause2 = new BasicDBObject("post_description", regex);    
BasicDBList or = new BasicDBList();
or.add(clause1);
or.add(clause2);
DBObject query = new BasicDBObject("$or", or);

谢谢,让我测试一下然后再回复你。 :) - MoienGK
我在MongoDB 3.2中尝试了这种方法,使用Java driver 3.2.2,但是我收到了错误消息:“无法解析方法dbColl.find(DBObject)”。请问您能否更新答案以适用于实际的Java driver版本。 - Mike
请查看https://dev59.com/jJbfa4cB1Zd3GeqPrUiW。 - Mike

13

使用筛选器你可以像下面这样构建自己的查询:

import com.mongodb.client.model.Filters;
...

Bson filter = Filters.or(
                    Filters.eq("post_title", regex), 
                    Filters.eq("post_description", regex)
                  );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接