使用正则表达式进行mongo elementMatch查询

Shi*_*gon 1 regex mongodb

好的,这个想法是这样的:

鉴于如下模型:

Release {

   Work[] works = ....

}
Run Code Online (Sandbox Code Playgroud)

Work {

   String title;

}
Run Code Online (Sandbox Code Playgroud)

我得到了如何使用标准搜索版本"有标题的工作=什么":

DBObject crit = new BasicDBObject();
crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title", "whatever")));
Run Code Online (Sandbox Code Playgroud)

我还得到了如何使用正则表达式来处理基本内容,例如"获取所有包含任何内容的tile":

crit.put("title", "/.*whatever.*/");
Run Code Online (Sandbox Code Playgroud)

但是,我该如何做一些像"获得所有版本以及包含任何内容的标题"的内容?

如果我试试这个,我什么也得不到:

crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title", "/.*whatever.*/")));
Run Code Online (Sandbox Code Playgroud)

谢谢

Shi*_*gon 8

好吧,好吧,我和这个问题中提出的问题几乎相同:

MongoDB正则表达式查询:为什么这不起作用?

基本上,如果使用Java驱动程序,则将正则表达式设置为

new BasicDBObject("title", "/.*whatever.*/")
Run Code Online (Sandbox Code Playgroud)

它不会工作(虽然他们的文档和mongo控制台测试sais它应该)

但是,如果您使用更详细的方式声明正则表达式标准,它将起作用:

crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title",new BasicDBObject("$regex",".*whatever.*"))));
Run Code Online (Sandbox Code Playgroud)

它变得更加混乱.如果希望对表达式不敏感应用正则表达式模式,请将$options:'i'名称值对添加到正则表达式条件对象,例如:

new BasicDBObject("$regex",".*whAteVer.*").put("$options","i")
Run Code Online (Sandbox Code Playgroud)

也不行.

相反,你必须将不敏感的正则表达式标志INSIDE你的正则表达式字符串,如下所示:

new BasicDBObject("$regex",".*((?i)whAteVer).*")
Run Code Online (Sandbox Code Playgroud)