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

Регулярные выражения используются для сопоставления с шаблонами, то есть для поиска строк в документах.
Иногда при получении документов в коллекции вы можете не знать точно, какое именно значение поля нужно искать. Следовательно, можно использовать регулярные выражения, чтобы помочь в извлечении данных на основе значений поиска, соответствующих шаблону.
Использование оператора $regex для сопоставления с шаблоном
Оператор $regex в MongoDB используется для поиска определенных строк в коллекции. Следующий пример показывает, как это можно сделать.
Предположим, у нас есть коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName». Также предположим, что в нашей коллекции есть следующие документы.
| Идентификатор сотрудника | Имя сотрудника |
|---|---|
| 22 | НьюМартин |
| 2 | Мохан |
| 3 | Джо |
| 4 | МоханР |
| 100 | Guru99 |
| 6 | Старый |
В приведенном ниже коде мы использовали оператор `$regex` для указания критериев поиска.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Объяснение:
- Здесь нам нужно найти все имена сотрудников, содержащие символы «Gu». Поэтому мы используем оператор $regex для определения критериев поиска по символу «Gu».
- printjson используется для более качественной печати каждого документа, возвращаемого запросом.
Если команда выполнена успешно, будет показан следующий вывод:
Выход:
Вывод ясно показывает, что возвращаются те документы, в которых имя сотрудника содержит символы «Гу».
Предположим, в вашей коллекции есть следующие документы, а также дополнительный документ, в котором имя сотрудника указано как "Guru999”. Если вы ввели критерии поиска как “Guru99”, это также вернуло бы документ, который содержал «Guru999”. Но предположим, что нам это не нужно, и мы хотим вернуть документ только с “Guru99”. Затем мы можем сделать это с помощью точного сопоставления с шаблоном. Для точного сопоставления с шаблоном мы будем использовать символы ^ и $. Мы добавим символ ^ в начало строки и $ в конец строки.
| Идентификатор сотрудника | Имя сотрудника |
|---|---|
| 22 | НьюМартин |
| 2 | Мохан |
| 3 | Джо |
| 4 | МоханР |
| 100 | Guru99 |
| 6 | Старый |
| 8 | Guru999 |
Следующий пример показывает, как это можно сделать.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code Объяснение:
- В критериях поиска мы используем символы ^ и $. Символ ^ используется для того, чтобы убедиться, что строка начинается с определенного символа, а символ $ — для того, чтобы строка заканчивалась определенным символом. Таким образом, при выполнении кода будет получена только строка с именем "Guru99 ".
- printjson используется для более качественной печати каждого документа, возвращаемого запросом.
Если команда выполнена успешно, будет показан следующий вывод:
Выход:
В выходных данных отчетливо видно, что строка «Guru99 дюймов доставлено.
Сопоставление с образцом с помощью $options
При использовании оператора `$regex` можно также указать дополнительные параметры, используя `$regex`. $ варианты ключевое слово. Например, предположим, что вы хотите найти все документы, в имени сотрудника которых есть буква «Гу», независимо от того, учитывается ли она или нет. Если такой результат желателен, то нам нужно использовать $ варианты с параметром нечувствительности к регистру.
Следующий пример показывает, как это можно сделать.
Предположим, у нас есть та же коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName».
Предположим также, что в нашей коллекции имеются следующие документы.
| Идентификатор сотрудника | Имя сотрудника |
|---|---|
| 22 | НьюМартин |
| 2 | Мохан |
| 3 | Джо |
| 4 | МоханР |
| 100 | Guru99 |
| 6 | Старый |
| 7 | ГУРУ99 |
Теперь, если мы выполним тот же запрос, что и в предыдущей теме, мы никогда не увидим документ с "GURU99" в результате. Чтобы гарантировать его появление в наборе результатов, нам нужно добавить параметр "i" в переменную $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Объяснение:
- Параметр $options со значением 'i' (что означает нечувствительность к регистру) указывает, что поиск должен выполняться независимо от того, в каком регистре найдены буквы 'Gu'.
Если команда выполнена успешно, будет показан следующий вывод:
Выход:
- Результат наглядно демонстрирует, что, несмотря на то, что в одном из документов используется заглавная буква «Gu», документ всё равно отображается в результирующем наборе.
Сопоставление с образцом без оператора регулярного выражения
Также можно выполнять сопоставление с шаблоном без оператора $regex. Следующий пример показывает, как это можно сделать.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code Объяснение:
- Разделители «//» по сути означают указание критериев поиска внутри этих разделителей. Таким образом, мы указываем /Gu/, чтобы снова найти те документы, в названии сотрудника которых содержится «Gu».
Если команда выполнена успешно, будет показан следующий вывод:
Выход:
Вывод ясно показывает, что возвращаются те документы, в которых имя сотрудника содержит символы «Гу».
Получение последних n документов из коллекции
Существуют различные способы получить последние n документов в коллекции.
Рассмотрим один из способов, выполнив следующие шаги.
Следующий пример показывает, как это можно сделать.
Предположим, у нас есть та же коллекция Employee, содержащая поля с именами «Employeeid» и «EmployeeName».
Предположим также, что в нашей коллекции имеются следующие документы:
| Идентификатор сотрудника | Имя сотрудника |
|---|---|
| 22 | НьюМартин |
| 2 | Мохан |
| 3 | Джо |
| 4 | МоханР |
| 100 | Guru99 |
| 6 | Старый |
| 7 | ГУРУ99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code Объяснение:
- При запросе документов используйте функцию сортировки, чтобы отсортировать записи в обратном порядке на основе значения поля _id в коллекции. Значение -1, по сути, указывает на сортировку документов в обратном или убывающем порядке, так что последний документ становится первым отображаемым документом.
- Затем используйте условие limit, чтобы отобразить только нужное количество записей. Здесь мы установили условие limit (2), поэтому будут получены последние два документа.
Если команда выполнена успешно, будет показан следующий вывод:
Выход:
Вывод ясно показывает, что отображаются два последних документа в коллекции. Таким образом, мы ясно показали, что для получения последних «n» документов в коллекции мы можем сначала отсортировать документы в порядке убывания, а затем использовать предложение ограничения для возврата необходимого количества «n» документов.
Внимание: Если поиск выполняется по строке, длина которой превышает, скажем, 38,000 XNUMX символов, правильные результаты не будут отображены.










