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