2012-05-16 2 views
32

Ich versuche, oder einige Bedingungen in MongoDB (mit dem Java-Treiber). Das ist, was ich tue:

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

Ich mag die $or Operanden auf diesen Bedingungen verwenden, aber ich denke, der Standard ist „und“ und ich weiß nicht, wie es zu ändern. Wenn im obigen Code eine der Bedingungen null zurückgibt, wird das Ergebnis ebenfalls null lauten.

+0

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

+0

Das sieht nicht gut aus. $ oder Klauseln werden von einem Array umschlossen, kein Objekt. –

+0

Jungs bitte beantworten Sie meine Frage http://StackOverflow.com/Questions/38115986/Writing-Mongodb-Syntax bitte ich brauche deine Hilfe> _ < – beboy

Antwort

66

Sie haben Korrekt, dass der "Standard" für die Angabe mehrerer Felder in einer Abfrage ist, dass jedes Feld als bedingter Filter dient und somit eine UND-Operation ist.

Sie können mit Hilfe des $ oder Operanden MongoDB-Abfragen mit einer OR-Klausel ausführen, die die folgende Syntax hat:

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

Wo jede Klausel eine Abfrage sein kann. $ oder muss kein Operand auf oberster Ebene sein, aber wenn es MongoDB ist, kann für jede separate Klausel ein Index verwendet werden.

In Ihrem Beispiel wollen Sie mit dieser Abfrage am Ende:

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

, die in Java durch konstruiert werden können:

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, lassen Sie mich testen und 2 u. :) – MoienGK

+0

yeppppp, das funktioniert, thnx – MoienGK

+0

Ich versuchte diesen Ansatz in MongoDB 3.2 mit Java-Treiber 3.2.2 und ich bekomme den Fehler: 'Kann die Methode dbColl.find (DBObject)' nicht auflösen. Können Sie bitte die Antwort für die aktuelle Java-Treiberversion aktualisieren? –

2

Mit filters Sie bauen können Sie gerne:

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