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

时间:2012-02-09 13:17:48

标签: regex mongodb

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

给出如下模型:

Release {

   Work[] works = ....

}

Work {

   String title;

}

我了解如何使用标准搜索版本“有标题工作=无论什么”:

DBObject crit = new BasicDBObject();
crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title", "whatever")));

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

crit.put("title", "/.*whatever.*/");

但是我该如何做一些像“获得所有包含标题的版本一样包含什么”的内容?

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

crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title", "/.*whatever.*/")));

由于

1 个答案:

答案 0 :(得分:8)

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

MongoDB Regex Query : Why doesn't this work?

基本上,如果使用Java驱动程序,则使用正则表达式,例如

new BasicDBObject("title", "/.*whatever.*/")

它不起作用(虽然他们的文档和mongo控制台测试应该是它应该)

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

crit.put("works", new BasicDBObject("$elemMatch",new BasicDBObject("title",new BasicDBObject("$regex",".*whatever.*"))));

它变得更加混乱。如果您希望以不区分大小写的方式应用正则表达式模式,请将$options:'i'名称值对添加到正则表达式条件对象,例如:

new BasicDBObject("$regex",".*whAteVer.*").put("$options","i")

也不起作用。

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

new BasicDBObject("$regex",".*((?i)whAteVer).*")