MongoDB Регулярные выражения ($regex) с примерами

⚡ Умное резюме

MongoDB Регулярные выражения выполняют сопоставление с шаблоном для поиска строк внутри документов, используя оператор $regex, флаг $options для нечувствительности к регистру, привязки для точного совпадения и разделители в виде косой черты, если точное значение поля неизвестно.

  • 🔍 $ регулярное выражение Operaтор: db.collection.find({field:{$regex:”pattern”}}) находит документы, содержащие заданный шаблон.
  • 🎯 Anchors: ^ и $ принудительно устанавливают точное совпадение, привязывая шаблон к началу и концу строки.
  • 🔠 Нечувствительность к регистру: Флаг 'i' в переменной $options соответствует тексту независимо от регистра.
  • Разделители в виде косой черты: Обернитеping Шаблон в /…/ срабатывает без указания оператора $regex.
  • 📉 Последние N документов: Объедините sort({_id:-1}) с limit(n), чтобы получить самые новые записи.
  • 🤖 AI-помощь: Помощники создают шаблоны регулярных выражений и отмечают затраты времени на сканирование всей коллекции.

MongoDB Регулярное выражение (Regex)

Регулярные выражения используются для сопоставления с шаблонами, то есть для поиска строк в документах.

Иногда при получении документов в коллекции вы можете не знать точно, какое именно значение поля нужно искать. Следовательно, можно использовать регулярные выражения, чтобы помочь в извлечении данных на основе значений поиска, соответствующих шаблону.

Использование оператора $regex для сопоставления с шаблоном

Оператор $regex в MongoDB используется для поиска определенных строк в коллекции. Следующий пример показывает, как это можно сделать.

Предположим, у нас есть коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName». Также предположим, что в нашей коллекции есть следующие документы.

Идентификатор сотрудника Имя сотрудника
22 НьюМартин
2 Мохан
3 Джо
4 МоханР
100 Guru99
6 Старый

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

Использование $regex Operaтор для сопоставления с образцом

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code Объяснение:

  1. Здесь нам нужно найти все имена сотрудников, содержащие символы «Gu». Поэтому мы используем оператор $regex для определения критериев поиска по символу «Gu».
  2. printjson используется для более качественной печати каждого документа, возвращаемого запросом.

Если команда выполнена успешно, будет показан следующий вывод:

Выход:

Использование $regex Operaтор для сопоставления с образцом

Вывод ясно показывает, что возвращаются те документы, в которых имя сотрудника содержит символы «Гу».

Предположим, в вашей коллекции есть следующие документы, а также дополнительный документ, в котором имя сотрудника указано как "Guru999”. Если вы ввели критерии поиска как “Guru99”, это также вернуло бы документ, который содержал «Guru999”. Но предположим, что нам это не нужно, и мы хотим вернуть документ только с “Guru99”. Затем мы можем сделать это с помощью точного сопоставления с шаблоном. Для точного сопоставления с шаблоном мы будем использовать символы ^ и $. Мы добавим символ ^ в начало строки и $ в конец строки.

Идентификатор сотрудника Имя сотрудника
22 НьюМартин
2 Мохан
3 Джо
4 МоханР
100 Guru99
6 Старый
8 Guru999

Следующий пример показывает, как это можно сделать.

Использование $regex Operaтор для сопоставления с образцом

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code Объяснение:

  1. В критериях поиска мы используем символы ^ и $. Символ ^ используется для того, чтобы убедиться, что строка начинается с определенного символа, а символ $ — для того, чтобы строка заканчивалась определенным символом. Таким образом, при выполнении кода будет получена только строка с именем "Guru99 ".
  2. printjson используется для более качественной печати каждого документа, возвращаемого запросом.

Если команда выполнена успешно, будет показан следующий вывод:

Выход:

Использование $regex Operaтор для сопоставления с образцом

В выходных данных отчетливо видно, что строка «Guru99 дюймов доставлено.

Сопоставление с образцом с помощью $options

При использовании оператора `$regex` можно также указать дополнительные параметры, используя `$regex`. $ варианты ключевое слово. Например, предположим, что вы хотите найти все документы, в имени сотрудника которых есть буква «Гу», независимо от того, учитывается ли она или нет. Если такой результат желателен, то нам нужно использовать $ варианты с параметром нечувствительности к регистру.

Следующий пример показывает, как это можно сделать.

Предположим, у нас есть та же коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName».

Предположим также, что в нашей коллекции имеются следующие документы.

Идентификатор сотрудника Имя сотрудника
22 НьюМартин
2 Мохан
3 Джо
4 МоханР
100 Guru99
6 Старый
7 ГУРУ99

Теперь, если мы выполним тот же запрос, что и в предыдущей теме, мы никогда не увидим документ с "GURU99" в результате. Чтобы гарантировать его появление в наборе результатов, нам нужно добавить параметр "i" в переменную $options.

Сопоставление с образцом с помощью $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code Объяснение:

  1. Параметр $options со значением 'i' (что означает нечувствительность к регистру) указывает, что поиск должен выполняться независимо от того, в каком регистре найдены буквы 'Gu'.

Если команда выполнена успешно, будет показан следующий вывод:

Выход:

Сопоставление с образцом с помощью $options

  1. Результат наглядно демонстрирует, что, несмотря на то, что в одном из документов используется заглавная буква «Gu», документ всё равно отображается в результирующем наборе.

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

Также можно выполнять сопоставление с шаблоном без оператора $regex. Следующий пример показывает, как это можно сделать.

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

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code Объяснение:

  1. Разделители «//» по сути означают указание критериев поиска внутри этих разделителей. Таким образом, мы указываем /Gu/, чтобы снова найти те документы, в названии сотрудника которых содержится «Gu».

Если команда выполнена успешно, будет показан следующий вывод:

Выход:

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

Вывод ясно показывает, что возвращаются те документы, в которых имя сотрудника содержит символы «Гу».

Получение последних n документов из коллекции

Существуют различные способы получить последние n документов в коллекции.

Рассмотрим один из способов, выполнив следующие шаги.

Следующий пример показывает, как это можно сделать.

Предположим, у нас есть та же коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName».

Предположим также, что в нашей коллекции имеются следующие документы:

Идентификатор сотрудника Имя сотрудника
22 НьюМартин
2 Мохан
3 Джо
4 МоханР
100 Guru99
6 Старый
7 ГУРУ99

Получение последних n документов из коллекции

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code Объяснение:

  1. При запросе документов используйте функцию сортировки, чтобы отсортировать записи в обратном порядке на основе значения поля _id в коллекции. Значение -1, по сути, указывает на сортировку документов в обратном или убывающем порядке, так что последний документ становится первым отображаемым документом.
  2. Затем используйте условие limit, чтобы отобразить только нужное количество записей. Здесь мы установили условие limit (2), поэтому будут получены последние два документа.

Если команда выполнена успешно, будет показан следующий вывод:

Выход:

Получение последних n документов из коллекции

Вывод ясно показывает, что отображаются два последних документа в коллекции. Таким образом, мы ясно показали, что для получения последних «n» документов в коллекции мы можем сначала отсортировать документы в порядке убывания, а затем использовать предложение ограничения для возврата необходимого количества «n» документов.

Внимание: Если поиск выполняется по строке, длина которой превышает, скажем, 38,000 XNUMX символов, правильные результаты не будут отображены.

Часто задаваемые вопросы (FAQ)

Anchor Шаблон с символами ^ и $. Шаблон «^»Guru99$” соответствует только “Guru99» и отвергает «Guru999”, потому что ^ обозначает начало строки, а $ — конец.

Только шаблоны с префиксом ^, чувствительные к регистру, эффективно используют индекс. Шаблоны без привязки к регистру или нечувствительные к регистру запускают полное сканирование коллекции, поэтому привязывайте префикс, когда это возможно.

Перед метасимволами, такими как точка, звездочка, плюс или скобки, используйте обратную косую черту. Например, шаблон для буквального окончания ".com" экранирует точку, поэтому она не рассматривается как любой другой символ.

$regex выполняет гибкое сопоставление шаблонов по одному полю и может сканировать всю коллекцию. $text использует текстовый индекс для быстрого поиска по словам в индексированных полях, но не поддерживает шаблоны частичных подстрок.

Да. Если искомая строка превышает примерно 38 000 символов, запрос может не вернуть корректные результаты. Для надежного сопоставления держите шаблоны и целевые поля в пределах этого лимита.

Для поиска без учета регистра сохраняйте копию поля в нижнем регистре, привязывайте шаблоны с помощью символа ^ и отдавайте предпочтение текстовому индексу или поиску Atlas Search для больших коллекций вместо не привязанных регулярных выражений $regex.

Искусственный интеллект преобразует простые правила на английском языке в шаблоны регулярных выражений ($regex), добавляет правильные привязки и флаг $options, а также предупреждает, когда запрос вызовет медленное полное сканирование коллекции.

Да. AI Copilot переписывает незакрепленные шаблоны, рекомендует текстовый индекс или поиск по атласу и преобразует регистронезависимые регулярные выражения в поиск по полю в нижнем регистре для повышения скорости.

Подведем итог этой публикации следующим образом: