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