Java Mongodb regex query

2022-09-02 10:00:28

我必须在Java中运行此查询

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

我的 Java 代码是

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

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

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

提前致谢。

编辑:

根据stribizhev的建议更新了查询及其工作原理

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

答案 1

您不能在 Java 中使用正则表达式分隔符,因为在 Java 中还有其他方法(例如标志)可以执行相同的操作。Pattern.compile

要强制执行不区分大小写的搜索,请使用内联修饰符 。因此,请使用 代替 .(?i)"^(?i)"+Pattern.quote(name)"/^"+name+"/i"

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


答案 2

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

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