题 如何使用Java驱动程序为MongoDB构建$或查询?


我正在尝试使用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 在这些条件下的操作数,但我猜默认是“和”,我不知道如何更改它。在上面的代码中,如果其中一个条件返回 null,结果将是 null 太。


33
2018-05-16 14:31


起源


'code'query.append(“$ or”,new BasicDBObject()。append(“post_title”,regex).append(“post_description”,regex)) - Ravi Khakhkhar
这看起来不对。 $或子句由数组包装而不是对象。 - Remon van Vliet
伙计们,请回答我的问题 stackoverflow.com/questions/38115986/writing-mongodb-syntax 我需要你的帮助> _ < - beboy


答案:


您是正确的,在查询中指定多个字段的“默认”是每个字段用作条件过滤器,因此是AND操作。

您可以使用具有以下语法的$或操作数,使用OR子句执行MongoDB查询:

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

每个子句都可以是查询。 $或者不必是顶级操作数,但如果是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);

70
2018-05-16 14:56



thnx,让我测试一下,然后回到你的身边。 :) - MoienGK
yeppppp,有效,thnx - MoienGK
我在带有Java驱动程序3.2.2的MongoDB 3.2中尝试了这种方法,我得到了错误: Can't resolve the method dbColl.find(DBObject)。请您更新实际Java驱动程序版本的答案。 - Mike B.
拜托,看看 stackoverflow.com/questions/36753254/... - Mike B.


过滤器 你可以建立你的:

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

5
2017-11-18 17:02