2012-05-16 13 views
32

Estoy tratando O O algunas condiciones en MongoDB (utilizando el controlador de Java). Esto es lo que estoy haciendo:

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

me gustaría usar el operando $or en estas condiciones, pero supongo que el valor por defecto es "y" y no sé qué hacer para cambiarlo. En el código anterior si una de las condiciones devuelve null, el resultado será null también.

+0

'código' query.append ("$ o", nuevo BasicDBObject(). Append ("post_title", regex) .append ("post_description", regex)) –

+0

Eso no se ve bien. $ o las cláusulas están envueltas por una matriz, no por un objeto. –

+0

chicos por favor respondan mi pregunta http://stackoverflow.com/questions/38115986/writing-mongodb-syntax por favor necesito su ayuda> _ < – beboy

Respuesta

66

Tiene razón en que el "valor predeterminado" para especificar múltiples campos en una consulta es que cada campo sirve como un filtro condicional, y por lo tanto es una operación AND.

puede realizar consultas MongoDB con una cláusula o usando el $ u operando que tiene la siguiente sintaxis:

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

Donde cada cláusula puede ser una consulta. $ o no tiene que ser un operando de nivel superior, pero si es MongoDB puede usar un índice para cada cláusula separada.

En su ejemplo se quiere terminar con esta consulta:

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

que puede ser construido en Java a través de:

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, déjenme probarlo y volver 2 u. :) – MoienGK

+0

yeppppp, that works, thnx – MoienGK

+0

Probé este enfoque en MongoDB 3.2 con el controlador Java 3.2.2 y me aparece el error: 'No se puede resolver el método dbColl.find (DBObject)'. Puede, por favor, actualizar la respuesta para la versión del controlador de Java real. –

2

Con filters puede crear el suyo gustan:

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