MongoDB: Индексы и регулярные выражения

Этот пример демонстрирует использование индекса с регулярными выражениями.

Запрос с регулярным выражением

Запрос к полю name использует регулярное выражение для поиска сочетания «al» без учёта регистра. Результат иллюстрирует важную особенность.

На стадии fetch видно, что происходит проверка ключей (keys examined), что подтверждает использование индекса. Однако, происходит сканирование всех ключей индекса, а не всех документов коллекции. Каждый ключ сопоставляется с регулярным выражением. Обратите внимание: total keys examined равно 1000, а total docs examined — 148. Сначала происходит проверка ключей, затем извлекаются документы.

Практический пример

Запрос с регулярным выражением для поиска «al» без учёта регистра:

db.collection.find({name: /al/i})

Результат:

  • parsed query: name — запрос с регулярным выражением (reg exp) и опцией I (без учёта регистра).
  • INDEX SCAN: указывает на использование индекса.
  • Index Bounds: демонстрирует сканирование всех ключей индекса с использованием регулярного выражения. Каждый ключ проверяется на соответствие.
  • ExecutionStats: время выполнения (1 миллисекунда), количество проверенных ключей (1000).
  • Найдено и возвращено 122 документа.

Вывод

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

Что будем искать? Например,программа