В данной статье мы рассмотрим механизм индексации в MongoDB.
Индексация поддерживает эффективное выполнение запросов. Без индексов, MongoDB необходимо сканировать каждый документ коллекции для выбора тех документов, которые соответствуют запросу. Данный процесс крайне не эффективен и требует обработки большого количества данных.
Индексы – это специальные структуры данных, которые хранят небольшие части данных в форме, которая легко распознаётся. Они хранят значение определённого поля или набора полей, упорядоченных по значению поля, указанному в индексе.
Метод ensureIndex()
В MongoDB для создания индекса нам необходимо использовать метод ensureIndex(). Данный метод имеет следующий синтаксис:
db.ИМЯ_КОЛЛЕКЦИИ.ensureIndex( {KEY: 1} )
Мы указываем имя коллекции, для которой мы хотим создать индекс, а число ‘1’ – порядок по возрастанию. Для сортировки по убыванию используется число – ‘-1’.
Рассмотрим простой пример:
Предположим, что у нас есть коллекция developers:
> db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolay Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 3500
}
Для того, что создать индекс по имени (title) для данной коллекции, нам необходимо использовать следующую команду:
> db.developers.ensureIndex( {"title": 1} )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Мы также можем передать несколько полей для индексации:
> db.developers.ensureIndex( {"title": 1, "specialty": -1} )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
Данный метод также может принимать список параметров, которые указаны ниже:
Параметр | Тип | Описание |
---|---|---|
background | Boolean | Создаёт индекс в фоновом режиме таким образом, что данный индекс не блокирует другие процессы базы данных (далее – БД). Для активации необходимо установить true. По умолчанию – false. |
unique | Boolean | Создаёт уникальный индекс таким образом, что коллекция не примет вставку документа, в котором ключ индекса, или ключи совпадают с уже существующими значениями. Для активации необходимо установить true. По умолчанию – false. |
name | string | Имя индекса. Если не указан, то MongoDB генерирует путём конкантенации имён индексируемых полей. |
dropDups | Boolean | Создаёт уникальный индекс для поля, которое может иметь дубликаты. MongoDB индексирует только первый случай ключа и удаляет все документы коллекции, которые содержат совпадения поля. Для активации необходимо установить true. По умолчанию – false. |
sparse | Boolean | Индекс ссылается на документ по указанному полю. Данный вид индексов используют меньше памяти. Но, в некоторых ситуациях, ведут себя по-другому. Для активации необходимо установить true. По умолчанию – false. |
expireAfterSeconds | integer | Определяет значение (в секундах) TTL для контроля того, как долго MongoDB сохраняет документ в коллекции. |
v | index version | Номер версии индекса. По умолчанию, версия индекса зависит от версии MongoDB во время создания индекса. |
weights | document | Число, которое ранжирует от 1 до 99,999 и обозначает важность соответствующего поля по отношению к другим индексируемым полям. |
default_language | string | Для текстового индекса это язык, который определяет список стоп-слов и правил для сущностей stemmer и tokenizer. По умолчанию – english |
language_override | string | Для текстового индекса определяет имя поля в документе, которое содержит, и переопределяет язык по умолчанию. |
На этом мы заканчиваем изучение индексации в MongoDB.
В следующей статье мы рассмотрим агрегацию документов.