Подтвердить что ты не робот

Как я могу построить $или запрос для MongoDB с помощью драйвера Java?

Я пытаюсь или некоторые условия в 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.

4b9b3361

Ответ 1

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

Вы можете выполнять запросы MongoDB с предложением OR с помощью $или операнда, который имеет следующий синтаксис:

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);

Ответ 2

С помощью фильтров вы можете создать свой, например:

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

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