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.