web-dev-qa-db-fra.com

Requête regex Java Mongodb

Je dois exécuter cette requête en Java

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

Mon code Java est 

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

Il ne renvoie aucune donnée, je pense que le code Java ci-dessus est en train de convertir 

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

Merci d'avance.

Modifier:

Sur la base de la suggestion stribizhev mis à jour la requête et son travaillé 

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

Code 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);
11
Indrajeet

Vous ne pouvez pas utiliser de délimiteurs d'expression régulière dans Java Pattern.compile, car il existe d'autres moyens en Java (par exemple, des indicateurs) pour effectuer la même chose.

Pour appliquer la recherche sans distinction de casse, utilisez le modificateur en ligne (?i). Donc, Utilise "^(?i)"+Pattern.quote(name) au lieu de "/^"+name+"/i".

Pattern.quote échappe simplement tous les métacaractères regex afin qu'ils soient traités comme des littéraux (comme \Q...\E).

6
Wiktor Stribiżew

J'imagine qu'il existe un moyen plus élégant de faire cela en Java, en utilisant les filtres fournis dans le pilote Java MongoDB (version 3 et ultérieure):

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"));
4
pulu

Vous pouvez utiliser Pattern - et Filters -

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

L'objet Motif a d'autres drapeaux, comme vous pouvez le voir ici

3
hestellez

La plupart des réponses ici ne fonctionnent pas pour moi (peut-être pas un pilote Java MongoDB à jour). Voici ce qui a fonctionné pour moi:

Document regexQuery = new Document();
regexQuery.append("$regex", ".*" + Pattern.quote(searchTerm) + ".*");
BasicDBObject criteria = new BasicDBObject("name", regexQuery);
DBCursor cursor = collection.find(criteria);
0
Mihael