Руководство по MongoDB. Индексация.

В данной статье мы рассмотрим механизм индексации в 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.
В следующей статье мы рассмотрим агрегацию документов.