2012-05-16 96 views
32

我正在尝试或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

+0

'code'query.append(“$ or”,new BasicDBObject()。append(“post_title”,regex).append(“post_description”,regex)) –

+0

这看起来不正确。 $或子句由数组包装而不是对象。 –

+0

家伙请回答我的问题http://stackoverflow.com/questions/38115986/writing-mongodb-syntax 我需要你的帮助> _ < – beboy

回答

66

对于在查询中指定多个字段的“默认”是正确的,即每个字段用作条件筛选器,因此是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); 
+0

thnx,让我测试它,并得到回2你。 :) – MoienGK

+0

yeppppp,that works,thnx – MoienGK

+0

我在MongoDB 3.2中使用Java驱动程序3.2.2尝试了这种方法,并且出现错误:'无法解析dbColl.find(DBObject)方法'。请问您可以更新实际Java驱动程序版本的答案。 –

2

随着filters你可以建立你喜欢:

Bson filter = Filters.or(
       Filters.eq("_id", mongoId), 
       Filters.eq("activo", true) 
       ); 
(“post_description”,regex))
相关问题