Как в MongoDB реализовать оператор LIKE из SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам требуется найти документы в MongoDB, поля которых соответствуют определенному шаблону, воспользуйтесь regex. Например, ниже приведен запрос для поиска все полей 'name', которые содержат букву 'm', при этом регистр игнорируется:

JS
Скопировать код
db.users.find({"name": /m/i}) // Отлично, вы ищете все записи, связанные в чем-то с 'm'!

/i здесь обозначает регистронезависимость, это аналог оператора SQL LIKE.

Кинга Идем в IT: пошаговый план для смены профессии

Подробный анализ – сложные запросы с помощью шаблонов

Возможности MongoDB для работы с регулярными выражениями значительно превышают возможности шаблонов 'LIKE' в SQL. Попробуем разобраться, как применять его функционал:

Использование маскированной звездочки для обозначения любого количества символов

Предположим, нам нужны все строки, где встречается 'm', причем не важно, в каком месте:

JS
Скопировать код
db.users.find({"name": /.*m.*/}) // 'm' может быть в любом месте строки!

Здесь маскированная звездочка .* выступает в роли оператора % в SQL.

Ограничение начала и окончания строки ваших запросов

Используйте оператор ^, если искомые имена должны начинаться на 'm':

JS
Скопировать код
db.users.find({"name": /^m/}) // символ 'm' находится в начале строки!

Если нужны имена, оканчивающиеся на 'm', воспользуйтесь оператором $:

JS
Скопировать код
db.users.find({"name": /m$/}) // 'm' является последним символом в строке!

Регистрозависимые и регистронезависимые запросы

MongoDB позволяет делать регистрозависимые и регистронезависимые поисковые запросы:

JS
Скопировать код
// Регистрозависимый запрос (только 'John', не 'john' или 'JOhN', потому что регистр важен)
db.users.find({ "name": { $regex: 'John' } })

// Регистронезависимый запрос (из всех 'John', 'john' и 'JOhN' выберем всех)
db.users.find({ "name": { $regex: 'John', $options: 'i' } })

Отрицательные шаблоны для исключения нежелательных результатов

Вы можете избегать появления определенных шаблонов в результатах, используя regex с отрицательным условием:

JS
Скопировать код
db.users.find({"name": /^(?!.*unwanted).*/}) // 'unwanted' не допускается в гости!

Такой подход вернет имена, в которых отсутствует слово 'unwanted'.

Краткое руководство по регулярным выражениям

Не забывайте о том, что для определения сложных шаблонов придется пользоваться справочником по регулярным выражениям. Его можно найти на MDN Web Docs.

Универсальность регулярных выражений

Регулярные выражения MongoDB могут быть легко адаптированы для различных языков программирования:

Python прекрасно работает с регулярными выражениями:

Python
Скопировать код
collection.find({"name": {"$regex": "world", "$options": "i"}}) // Python знает, что 'world' может быть разный

Node.js с радостью встречает регулярные выражения:

JS
Скопировать код
collection.find({"name": new RegExp('world', 'i')}) // Node.js тоже отлично ладит с регулярными выражениями

Визуализация

Представьте, что вы в библиотеке 📚 ищете книги с упоминанием 'драконов'. С помощью поиска 'like' в MongoDB вы без труда найдете нужные истории.

SQL
Скопировать код
db.books.find({ "story": { $regex: /.*dragons.*/i } }); // 🐉 Рассказ о драконе уже здесь и сейчас!

Таким образом, истории о драконах становятся на первое место, а остальные отходят на второй план.

Советы и возможные трудности

Есть несколько важных аспектов, на которые стоит обратить внимание при использовании regex в MongoDB:

Оптимизация производительности

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

Экранирование специальных символов

Если ваш шаблон содержит специальные символы, обязательно эскейпите их, чтобы они не влияли на результаты:

JS
Скопировать код
db.users.find({ "name": /Jo\.Doe/ }) // Точка между Jo и Doe – именно точка, а не любой символ!

Проверка перед применением

Помните о важном правиле при работе с regex: проверяйте свои шаблоны на корректность и эффективность их работы, прежде чем запускать их в боевой среде.

Полезные материалы

  1. $regex — MongoDB Manual — Официальное описание оператора $regex для поиска по шаблону в документации MongoDB.
  2. sql – How to query MongoDB with "like" – Stack Overflow — Обсуждение вопроса о работе функции 'like' в MongoDB на Stack Overflow.
  3. Full-Text Search in MongoDB | Envato Tuts+ — Обзор возможностей полнотекстового поиска в MongoDB.
  4. What is MongoDB Atlas Search? — MongoDB Atlas — Определение функциональности поиска в платформе MongoDB Atlas.
  5. Using MongoDB 'LIKE' Query with Example Projects – DZone — Примеры использования запроса 'like' в MongoDB на DZone.