MongoDB Регулярний вираз ($regex) з прикладами

⚡ Розумний підсумок

MongoDB Регулярні вирази виконують зіставлення зі зразком для пошуку рядків у документах, використовуючи оператор $regex, прапорець $options для нечутливості до регістру, прив'язки для точних збігів та роздільники зі сксельною рискою, коли точне значення поля невідоме.

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

MongoDB Регулярний вираз (Regex)

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

Іноді під час отримання документів у колекції ви можете не знати точно, яке саме значення поля потрібно шукати. Отже, можна використовувати регулярні вирази, щоб допомогти отримати дані на основі пошукових значень, що відповідають шаблонам.

Використання оператора $regex для зіставлення шаблону

Оператор $regex у MongoDB використовується для пошуку певних рядків у колекції. Наступний приклад показує, як це можна зробити.

Припустимо, що у нас є та сама колекція Employee, яка має назви полів «Employeeid» та «EmployeeName». Також припустимо, що в нашій колекції є такі документи.

ID працівника ім'я працівника
22 Новий Мартін
2 Мохан
3 Джо
4 Мохан Р
100 Guru99
6 Gurang

Тут, у наведеному нижче коді, ми використали оператор $regex для визначення критеріїв пошуку.

Використання $regex Operator для зіставлення шаблонів

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

Code Пояснення:

  1. Тут ми хочемо знайти всі імена співробітників, які містять символи «Gu». Тому ми вказуємо оператор $regex для визначення критеріїв пошуку «Gu».
  2. Printjson використовується для кращого друку кожного документа, який повертає запит.

Якщо команда виконана успішно, буде показано наступний результат:

вихід:

Використання $regex Operator для зіставлення шаблонів

Вихідні дані чітко показують, що повертаються ті документи, у яких ім’я працівника містить символи «Gu».

Припустимо, що ваша колекція містить такі документи, а також додатковий документ, у якому ім'я співробітника вказано як «Guru999”. Якщо ви ввели критерії пошуку як «Guru99”, він також поверне документ, який мав «Guru999”. Але припустимо, що ми цього не хочемо, а хочемо повернути документ лише з кодом “Guru99”. Тоді ми можемо зробити це за допомогою точного зіставлення зі зразком. Щоб виконати точне зіставлення зі зразком, ми використовуватимемо символи ^ та $. Ми додамо символ ^ на початок рядка та $ у кінець рядка.

ID працівника ім'я працівника
22 Новий Мартін
2 Мохан
3 Джо
4 Мохан Р
100 Guru99
6 Gurang
8 Guru999

Наступний приклад показує, як це можна зробити.

Використання $regex Operator для зіставлення шаблонів

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

Code Пояснення:

  1. Тут, у критеріях пошуку, ми використовуємо символи ^ та $. Символ ^ використовується, щоб переконатися, що рядок починається з певного символу, а $ використовується, щоб переконатися, що рядок закінчується певним символом. Таким чином, коли код виконується, він отримає лише рядок з назвою «Guru99 ".
  2. Printjson використовується для кращого друку кожного документа, який повертає запит.

Якщо команда виконана успішно, буде показано наступний результат:

вихід:

Використання $regex Operator для зіставлення шаблонів

У виводі чітко видно, що рядок «GuruОтримано 99 дюймів.

Зіставлення шаблону з $options

Під час використання оператора $regex також можна надати додаткові опції, використовуючи $параметри ключове слово. Наприклад, припустімо, що ви хочете знайти всі документи, у імені співробітника яких є «Gu», незалежно від того, чи враховується регістр чи не враховується. Якщо такий результат бажаний, то нам потрібно використовувати $параметри з параметром нечутливості до регістру.

Наступний приклад показує, як це можна зробити.

Припустимо, що у нас є та сама колекція Employee, яка має назви полів «Employeeid» та «EmployeeName».

Також припустимо, що в нашій колекції є такі документи.

ID працівника ім'я працівника
22 Новий Мартін
2 Мохан
3 Джо
4 Мохан Р
100 Guru99
6 Gurang
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тор

Вихідні дані чітко показують, що повертаються ті документи, у яких ім’я працівника містить символи «Gu».

Отримання останніх 'n' документів із колекції

Існують різні способи отримати останні n документів у колекції.

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

Наступний приклад показує, як це можна зробити.

Припустимо, що у нас є та сама колекція Employee, яка має назви полів «Employeeid» та «EmployeeName».

Також припустимо, що в нашій колекції є такі документи:

ID працівника ім'я працівника
22 Новий Мартін
2 Мохан
3 Джо
4 Мохан Р
100 Guru99
6 Gurang
7 ГУРУ99

Отримання останніх n документів з колекції

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

Code Пояснення:

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

Якщо команда виконана успішно, буде показано наступний результат:

вихід:

Отримання останніх n документів з колекції

Вихідні дані чітко показують, що відображаються останні два документи в колекції. Отже, ми чітко показали, що для отримання останніх 'n' документів у колекції ми можемо спочатку відсортувати документи в порядку спадання, а потім використати обмеження, щоб повернути 'n' кількість необхідних документів.

Примітка:: Якщо пошук виконується в рядку, який перевищує, наприклад, 38,000 XNUMX символів, він не відображатиме правильні результати.

Поширені запитання

Anchor шаблон з символами ^ та $. Шаблон “^Guru«99$» відповідає лише «Guru99” та відхиляє “Guru999”, оскільки ^ пов’язує початок рядка, а $ – його кінець.

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

Метасимволи, такі як крапка, зірочка, плюс або дужки, мають передувати зворотній слеш. Наприклад, шаблон для закінчення буквального домену «.com» екранує крапку, тому вона не розглядається як будь-який інший символ.

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

Так. Якщо довжина рядка пошуку перевищує приблизно 38 000 символів, запит може повернути неправильні результати. Для надійного зіставлення шаблони та цільові поля повинні перевищувати це обмеження.

Зберігайте копію поля, написану малими літерами, для пошуку без урахування регістру, встановлюйте прив'язки за допомогою символу ^ та надавайте перевагу текстовому індексу або пошуку в Атласі для великих колекцій замість не прив'язаного регулярного виразу $.

Помічники ШІ перетворюють правила простою англійською мовою на шаблони $regex, додають правильні прив'язки та прапорець $options, а також попереджають, коли запит запускатиме повільне повне сканування колекції.

Так. AI Copilot переписує незакріплені шаблони, рекомендує текстовий індекс або пошук за Атласом і перетворює регістронезалежний $regex на пошук у полях з нижніми літерами для пришвидшення.

Підсумуйте цей пост за допомогою: