MongoDB - регулярное выражение
Регулярные выражения часто используются во всех языках для поиска шаблона или слова в любой строке. MongoDB также предоставляет функциональность регулярного выражения для сопоставления строкового шаблона с использованием$regexоператор. MongoDB использует PCRE (Perl-совместимое регулярное выражение) в качестве языка регулярных выражений.
В отличие от текстового поиска, нам не нужно выполнять какие-либо настройки или команды для использования регулярных выражений.
Предположим, мы вставили документ в базу данных с именем posts как показано ниже -
> db.posts.insert(
{
"post_text": "enjoy the mongodb articles on tutorialspoint",
"tags": [
"mongodb",
"tutorialspoint"
]
}
WriteResult({ "nInserted" : 1 })
Использование выражения регулярного выражения
Следующий запрос регулярного выражения ищет все сообщения, содержащие строку tutorialspoint в нем -
> db.posts.find({post_text:{$regex:"tutorialspoint"}}).pretty()
{
"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [
"mongodb",
"tutorialspoint"
]
}
{
"_id" : ObjectId("5dd7d111f1dd4583e7103fe2"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [
"mongodb",
"tutorialspoint"
]
}
>
Тот же запрос также можно записать как -
>db.posts.find({post_text:/tutorialspoint/})
Использование выражения регулярного выражения с нечувствительностью к регистру
Чтобы сделать поиск нечувствительным к регистру, мы используем $options параметр со значением $i. Следующая команда будет искать строки со словомtutorialspoint, независимо от мелкой или большой буквы -
>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})
Одним из результатов этого запроса является следующий документ, содержащий слово tutorialspoint в разных случаях -
{
"_id" : ObjectId("53493d37d852429c10000004"),
"post_text" : "hey! this is my post on TutorialsPoint",
"tags" : [ "tutorialspoint" ]
}
Использование регулярного выражения для элементов массива
Мы также можем использовать концепцию регулярного выражения в поле массива. Это особенно важно, когда мы реализуем функции тегов. Итак, если вы хотите найти все сообщения с тегами, начинающимися со слова «учебник» (либо учебник, либо учебные пособия, либо учебная точка, либо учебникphp), вы можете использовать следующий код -
>db.posts.find({tags:{$regex:"tutorial"}})
Оптимизация запросов с регулярными выражениями
Если поля документа indexed, запрос будет использовать индексированные значения для соответствия регулярному выражению. Это делает поиск очень быстрым по сравнению с регулярным выражением, просматривающим всю коллекцию.
Если регулярное выражение prefix expression, все совпадения должны начинаться с определенных строковых символов. Например, если выражение регулярного выражения^tut, то запрос должен искать только те строки, которые начинаются с tut.