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