web-dev-qa-db-fra.com

Comment puis-je créer un $ ou une requête pour MongoDB en utilisant le pilote Java?

J'essaie Ou certaines conditions dans MongoDB (en utilisant le Java). C'est ce que je fais:

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

J'aimerais utiliser le $or opérande dans ces conditions, mais je suppose que la valeur par défaut est "et" et je ne sais pas comment le changer. Dans le code ci-dessus, si l'une des conditions renvoie null, le résultat sera également null.

35
MoienGK

Vous avez raison de dire que la "valeur par défaut" pour spécifier plusieurs champs dans une requête est que chaque champ sert de filtre conditionnel et constitue donc une opération ET.

Vous pouvez effectuer des requêtes MongoDB avec une clause OR en utilisant l'opérande $ ou qui a la syntaxe suivante:

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

Où chaque clause peut être une requête. $ or ne doit pas être un opérande de niveau supérieur, mais s'il l'est, MongoDB peut utiliser un index pour chaque clause distincte.

Dans votre exemple, vous souhaitez vous retrouver avec cette requête:

db.col.find({$or:[{"post_title", regex}, {"post_description", regex}]});  

Qui peut être construit en Java via:

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);
71
Remon van Vliet

Avec filtres vous pourriez construire le vôtre comme:

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

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