Вы можете создать индекс для поля, к которому вы применяете фильтр запросов, используя регулярное выражение. Например, рассмотрим документы в коллекции person
:
{ "name" : "ravi" }
{ "name" : "ram" }
{ "name" : "John" }
{ "name" : "renu" }
{ "name" : "Raj" }
{ "name" : "peter" }
Следующий запрос (запускается из Mon go Shell) находит и выбирает четыре документа с именами, начинающимися с буквы «r» или «R»:
db.person.find( { name: { $regex: "^r", $options: "i" } } )
Но запрос выполняет сканирование коллекции без индекса в поле name
. Итак, создайте индекс на поле.
db.person.createIndex( { name: 1 } )
Теперь запустите запрос и сгенерируйте план запроса для того же запроса (используя explain()
). План запроса показал, что это IXSCAN (индексированное сканирование). И это будет эффективно выполняемый запрос.
Обратите внимание, что поиск префикса (как в предыдущем запросе с использованием ^
) по полям индекса приводит к более быстрым запросам.
Из документация :
Для запросов с регулярным выражением с учетом регистра, если для поля существует индекс, тогда MongoDB сопоставляет регулярное выражение со значениями в индексе, что может быть быстрее, чем сканирование коллекции. Дальнейшая оптимизация может произойти, если регулярное выражение является «префиксным выражением», что означает, что все потенциальные совпадения начинаются с одной и той же строки. Это позволяет MongoDB построить «диапазон» из этого префикса и сопоставлять его только с теми значениями из индекса, которые попадают в этот диапазон.
Хотя в документации сказано следующее (см. Ниже параграф), запрос Я использовал индекс, и план запроса, сгенерированный с использованием explain()
, показал сканирование индекса.
В запросах регулярных выражений, не учитывающих регистр, обычно нельзя эффективно использовать индексы. Реализация $ regex не учитывает параметры сортировки и не может использовать индексы без учета регистра.