2015-09-22 21 views
10

devo eseguire questa query in JavaJava MongoDB interrogazione regex

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

mio Java è

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

Non sta tornando alcun dato, credo che il codice Java di cui sopra è la conversione

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

Grazie in anticipo.

Edit:

Sulla base stribizhev suggerimento aggiornato la query e il suo operato codice

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

In Java, non utilizzare delimitatori regex. Prova '"^(? I) "+ Pattern.quote (name)' invece di '"/^ "+ name +"/i "'. –

+0

Grazie, ha funzionato in modo sostanziale "^ (?)" + Pattern.quote ("ind") ha convertito il valore in^(?) \ Qind \ E – Indrajeet

+0

Sì, è vero. Ho inviato il suggerimento come risposta. –

risposta

5

Non è possibile utilizzare delimitatori regex in Java Pattern.compile, in quanto vi sono altri mezzi in Java (es. bandiere) per fare lo stesso.

Per applicare la ricerca senza distinzione tra maiuscole e minuscole, utilizzare il modificatore in linea (?i). Quindi, utilizza "^(?i)"+Pattern.quote(name) anziché "/^"+name+"/i".

Pattern.quote sfugge solo a tutti i metacaratteri di espressioni regolari in modo che siano stati trattati come valori letterali (come \Q ... \E).

+0

Sì, esattamente così ho aggiornato anche la query mongo per usare questo db.Users.find ({"nome": {"$ regex":/^ ind /, "$ opzioni": "i"}}) Il codice Java è Document regQuery = new Document(); \t \t \t \t regQuery.append ("$ regex", "^ (?)" + Pattern.quote (nome)); \t \t \t \t regQuery.append ("$ options", "i"); – Indrajeet

+0

È possibile aggiungere questo codice alla fine alla domanda. –

3

Credo che ci sia un modo più elegante per farlo in Java, utilizzando i filtri previsti nel driver di MongoDB Java (versione 3 e superiori):

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

Si potrebbe utilizzare modello -e Filtri-

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

Il modello oggetto ha alcune altre bandiere, come è possibile vedere here