2012-05-16 135 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))
相關問題