Монго элементMatch запрос с использованием регулярных выражений - PullRequest
1 голос
/ 09 февраля 2012

Хорошо, идея такова:

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

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 Ответ

8 голосов
/ 09 февраля 2012

Хорошо, хорошо, у меня была та же проблема, что и в этом вопросе:

Запрос регулярного выражения MongoDB: Почему это не работает?

В основном, если с помощью драйвера 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).*")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...