Регулярные выражения в 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"}
Другие расширения