Java Mongodb正则表达式查询

Ind*_*eet 15 java regex mongodb

我必须用Java运行这个查询

 db.Users.find({"name": /^ind/i})
Run Code Online (Sandbox Code Playgroud)

我的Java代码是

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

它没有返回任何数据,我认为上面的java代码正在转换

> /^ind/i into "/^ind/i"
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑:

基于stribizhev建议更新查询及其工作

db.Users.find({"name": {"$regex": /^ind/, "$options": "i"}})
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 8

您不能在Java中使用正则表达式分隔符Pattern.compile,因为Java 中还有其他方法(例如标志)也可以这样做.

要强制执行不区分大小写的搜索,请使用内联修饰符(?i).所以,用"^(?i)"+Pattern.quote(name)而不是"/^"+name+"/i".

Pattern.quote只是逃避所有正则表达式元字符,以便将它们视为文字(与\Q... 相同\E).


pul*_*ulu 6

我想通过使用MongoDB Java驱动程序(版本3及更高版本)中提供的过滤器,在Java中有一种更优雅的方法:

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"));
Run Code Online (Sandbox Code Playgroud)


est*_*ezg 5

你可以使用模式 - 和过滤器 -

Pattern regex = Pattern.compile("ind", Pattern.CASE_INSENSITIVE);
Bson filter = Filters.eq("name", regex);
Run Code Online (Sandbox Code Playgroud)

对象 Pattern 有一些其他标志,就像你在这里看到的