2015-09-22 5 views
10

muszę uruchomić tę kwerendę w JavieJava MongoDB zapytania regex

kod
db.Users.find({"name": /^ind/i}) 

My Java jest

Document findQuery = new Document(); 
findQuery.append("name", Pattern.compile("/^"+name+"/i")); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 

To nie jest powrót żadnych danych, myślę, że powyższy kod Java jest konwersja

> /^ind/i into "/^ind/i" 

Z góry dziękuję.

Edit:

podstawie stribizhev sugestią zaktualizowanej zapytaniu i jego pracował kodu

db.Users.find({"name": {"$regex": /^ind/, "$options": "i"}}) 

Java

Document regQuery = new Document(); 
regQuery.append("$regex", "^(?)" + Pattern.quote(name)); 
regQuery.append("$options", "i"); 

Document findQuery = new Document(); 
findQuery.append("name", regQuery); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 
+2

w Javie, nie używać regex ograniczniki. Spróbuj '"^(? I) "+ Pattern.quote (name)' zamiast '"/^ "+ name +"/i "'. –

+0

Dzięki, zadziałało to w zasadzie "^ (?)" + Wzorzec.quote ("ind") przekonwertował wartość na^(?) \ Qind \ E – Indrajeet

+0

Tak, to prawda. Wysłałem sugestię jako odpowiedź. –

Odpowiedz

5

Nie można używać regex ograniczniki w Javie Pattern.compile, gdyż istnieje inne środki w Javie (np. flagi), aby zrobić to samo.

Aby wymusić wyszukiwanie bez rozróżniania wielkości liter, użyj wbudowanego modyfikatora (?i). Tak więc użyj "^(?i)"+Pattern.quote(name) zamiast "/^"+name+"/i".

Pattern.quote prostu ucieka wszystkie metaznaki regex, tak aby były one traktowane jako literały (tak samo jak \Q ... \E).

+0

Tak, dokładnie zaktualizowałem zapytanie mongo i używam tego db.Users.find ({"name": {"$ regex":/^ ind /, "$ options": "i"}}) Kod Java to Dokument regQuery = new Document(); \t \t \t \t regQuery.append ("$ regex", "^ (?)" + Pattern.quote (name)); \t \t \t \t regQuery.append ("$ options", "i"); – Indrajeet

+0

Na końcu możesz dodać ten kod do pytania. –

3

Chyba jest bardziej elegancki sposób to zrobić w Javie, za pomocą dostarczonych filtrów w sterowniku MongoDB Java (wersja 3 i powyżej):

Document query = new Document("equipment","gloves"); 

//whatever pattern you need. But you do not need the "/" delimiters 
String pattern = ".*" + query.getString("equipment") + ".*"; 

//find(regex("field name", "pattern", "options")); 
collection.find(regex("equipment", pattern, "i")); 
1

Można użyć wzoru -I filtry-

Pattern regex = Pattern.compile("ind", Pattern.CASE_INSENSITIVE); 
Bson filter = Filters.eq("name", regex); 

przedmiotem Wzór ma jakieś inne flagi, jak widać here