2012-05-16 6 views
32

Sto provando a O alcune condizioni in MongoDB (usando il driver Java). Questo è quello che sto facendo:

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

mi piacerebbe utilizzare la $or operando in queste condizioni, ma credo che il valore predefinito è "e" e non so come cambiarlo. Nel codice sopra riportato, se una delle condizioni restituisce null, il risultato sarà null.

+0

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

+0

Quello non sembra giusto. $ o le clausole sono racchiuse da una matrice e non da un oggetto. –

+0

ragazzi per favore rispondi alla mia domanda http://stackoverflow.com/questions/38115986/writing-mongodb-syntax per favore ho bisogno del tuo aiuto> _ < – beboy

risposta

66

È corretto che il "valore predefinito" per specificare più campi in una query è che ogni campo funge da filtro condizionale e quindi è un'operazione AND.

è possibile eseguire query MongoDB con una clausola OR utilizzando il $ o operando, che ha la seguente sintassi:

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

Dove ogni clausola può essere una query. $ o non deve essere un operando di primo livello, ma se è MongoDB può usare un indice per ogni clausola separata.

Nel tuo esempio si vuole finire con questa query:

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

che può essere costruito in Java tramite:

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, fammi testarlo e riprenditi 2 u. :) – MoienGK

+0

yeppppp, che funziona, thnx – MoienGK

+0

Ho provato questo approccio in MongoDB 3.2 con il driver Java 3.2.2 e ho ricevuto l'errore: 'Impossibile risolvere il metodo dbColl.find (DBObject)'. Puoi, per favore, aggiornare la risposta per l'effettiva versione del driver Java. –

2

Con filters si può costruire la vostra piace:

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