2012-05-16 8 views
32

Próbuję Lub niektórych warunków w MongoDB (przy użyciu sterownika Java). To, co robię:

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

Chciałbym użyć $or argument na tych warunkach, ale myślę, domyślnie jest to „a” i nie wiem jak to zmienić. W powyższym kodzie, jeśli jeden z warunków zwróci null, wynik będzie również null.

+0

"Kod" query.append ("$ or", nowy BasicDBObject(). Append ("post_title", regex) .append ("post_description", regex)) –

+0

To nie wygląda dobrze. $ lub klauzule są pakowane przez tablicę, a nie przez obiekt. –

+0

faceci proszę odpowiedzieć na moje pytanie http://stackoverflow.com/questions/38115986/writing-mongodb-syntax proszę potrzebuję twojej pomocy> _ < – beboy

Odpowiedz

66

Masz rację, że "domyślny" dla określania wielu pól w zapytaniu jest taki, że każde pole służy jako filtr warunkowy, a zatem jest operacją AND.

można wykonać zapytania MongoDB z klauzulą ​​lub za pomocą $ lub argumentu, który ma następującą składnię:

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

Gdzie każdy może być klauzula kwerendy. $ lub nie musi być operandem najwyższego poziomu, ale jeśli to MongoDB może używać indeksu dla każdej oddzielnej klauzuli.

W przykładzie chcesz skończyć z tym zapytaniem:

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

który może być zbudowany w Javie przez:

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, pozwól mi przetestować i wrócić 2 u. :) – MoienGK

+0

yeppppp, to działa, thnx – MoienGK

+0

Próbowałem tego podejścia w MongoDB 3.2 ze sterownikiem Java 3.2.2 i pojawia się błąd: 'Nie można rozwiązać metody dbColl.find (DBObject)'. Czy możesz, proszę, zaktualizować odpowiedź na rzeczywistą wersję sterownika Java. –

2

Z filters można zbudować swoje podoba:

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