Регулярные выражения в MongoDB

Регулярное выражение — это одна строка, используемая для описания и сопоставления ряда строк, соответствующих определённому синтаксическому правилу.

Многие языки программирования поддерживают операции со строками с использованием регулярных выражений.

MongoDB использует оператор$regexдля задания регулярного выражения для сопоставления строк.

MongoDB использует PCRE (Perl-совместимые регулярные выражения) в качестве языка регулярных выражений.

В отличие от полнотекстового поиска, использование регулярных выражений не требует настройки.

Рассмотрим следующую структуру документаpostsколлекции, которая содержит содержимое статьи и теги:

{
   "post_text": "enjoy the mongodb articles on example",
   "tags": [
      "mongodb",
      "example"
   ]
}

Использование регулярных выражений

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

>db.posts.find({post_text:{$regex:"example"}})

Приведённый выше запрос также можно записать так:

>db.posts.find({post_text:/example/})

Регулярные выражения без учёта регистра

Если поиск должен быть без учёта регистра, можно установить $options в $i.

Следующая команда найдёт строку example без учёта регистра:

>db.posts.find({post_text:{$regex:"example",$options:"$i"}})

Коллекция вернёт все данные, содержащие строку example, без учёта регистра:

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on  example", 
   "tags" : [ "example" ]
} 

Использование регулярных выражений для элементов массива

Мы также можем использовать регулярные выражения в полях массива для поиска содержимого. Это очень полезно при реализации тегов. Если нужно найти данные тега, начинающиеся с run (ru или run или example), можно использовать следующий код:

>db.posts.find({tags:{$regex:"run"}})

Оптимизация запросов с регулярными выражениями

  • Если для поля в ваших документах задан индекс, использование индекса быстрее, чем использование регулярного выражения для сопоставления и поиска всех данных.
  • Если регулярное выражение является префиксным выражением, все совпавшие данные будут начинаться с указанной строки префикса. Например: Если регулярное выражение — ^tut , запрос будет искать строки, которые начинаются с tut.

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

Использование переменных в регулярных выражениях. Обязательно используйте eval для преобразования объединённой строки; нельзя напрямую передавать объединённую строку в выражение. В противном случае сообщение об ошибке не появится, будет только пустой результат! Пример ниже:

var name=eval("/" + 变量值key +"/i"); 

Ниже приведён нечёткий запрос, который содержит ключевое слово title и не учитывает регистр:

title:eval("/"+title+"/i")    // 等同于 title:{$regex:title,$Option:"$i"}   
Другие расширения