2012-05-16 3 views
32

J'essaie de Ou certaines conditions dans MongoDB (en utilisant le pilote Java). Voilà 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")); 
} 

Je voudrais utiliser l'opérande $or sur 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.

+0

'code' query.append ("$ or", nouveau BasicDBObject(). Append ("post_title", regex) .append ("post_description", regex)) –

+0

Cela ne semble pas correct. Les clauses $ ou sont enveloppées par un tableau et non un objet. –

+0

gars s'il vous plaît répondez à ma question http://stackoverflow.com/questions/38115986/writing-mongodb-syntax s'il vous plaît j'ai besoin de votre aide> _ < – beboy

Répondre

66

Vous avez raison de dire que la valeur par défaut pour spécifier un champ multiple dans une requête est que chaque champ sert de filtre conditionnel et qu'il s'agit donc d'une opération ET.

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

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

Si chaque clause peut être une requête. $ ou ne doit pas être un opérande de premier niveau mais si c'est MongoDB peut utiliser un index pour chaque clause séparée.

Dans votre exemple, vous voulez finir avec cette requête:

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

Ce qui peut être construit en Java par:

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, laissez-moi le tester et revenir 2 u. :) – MoienGK

+0

yeppppp, cela fonctionne, thnx – MoienGK

+0

J'ai essayé cette approche dans MongoDB 3.2 avec le pilote Java 3.2.2 et j'obtiens l'erreur: 'Impossible de résoudre la méthode dbColl.find (DBObject)'. Pouvez-vous, s'il vous plaît, mettre à jour la réponse pour la version actuelle du pilote Java. –

2

Avec filters vous pouvez construire le vôtre aime:

Bson filter = Filters.or(
       Filters.eq("_id", mongoId), 
       Filters.eq("activo", true) 
       ); 
Questions connexes