2012-02-09 4 views
1

Ok, идея заключается в следующем:Монго elementMatch запрос с использованием регулярных выражений

Учитывая модель, такие как:

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

Благодаря

ответ

8

Ну, хорошо, я был в значительной степени тот же вопрос, что и представленная в этом вопросе:

MongoDB Regex Query : Why doesn't this work?

В принципе, если, используя драйвер Java, вы помещаете свое регулярное выражение, такое как

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

он не будет работать (хотя их документации и Монго тест консоли саис он должен)

Однако, если вы используете более подробный способ объявления по вашим критериям регулярных выражений, он будет работать:

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