2012-05-16 2 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

Вы правы, что «по умолчанию» для указания нескольких полей в запросе состоит в том, что каждое поле служит в качестве условного фильтра и, следовательно, является операцией И.

Вы можете выполнять запросы 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 u. :) – MoienGK

+0

yeppppp, который работает, 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) 
       ); 

 Смежные вопросы

  • Нет связанных вопросов^_^