Индексы позволяют упорядочить данные по определенному полю, что впоследствии ускорит поиск. Например, если мы в своем приложении или задаче, как правило, выполняем поиск по полю name
, то мы можем индексировать коллекцию по этому полю:
db.users.createIndex({"name": 1})
Таким образом с помощью метода createIndex
устанавливается индекс по полю name. MongoDB позволяет установить до 64 индексов на одну коллекцию.
Настройка индексов
Если мы просто определим индекс для коллекции, например, db.users.createIndex({"name" : 1})
, то мы все еще сможем добавлять в коллекцию документы с одинаковым значением ключа name
. Однако, если нам потребуется, чтобы в коллекцию можно было добавлять документ с одним и тем же значением ключа только один раз, мы можем установить флаг unique
:
db.users.createIndex({"name": 1}, {"unique": true})
Теперь, если мы попытаемся добавить в коллекцию два документа с одним и тем же значением name, то мы получим ошибку.
В тоже время тут есть свои тонкости. Так, документ может не иметь ключа name
. В этом случае для добавляемого документа автоматически создается ключ name со значением null. Поэтому при добавлении второго документа, в котором не определен ключ name, будет выброшено исключение, так как ключ name со значением null уже присутствует в коллекции.
Также можно задать уникальный индекс сразу для двух полей:
db.users.createIndex({"name": 1, "age": 1}, {"unique": true})
Однако в этом случае все добавляемые документы должны иметь уникальные значения для обоих полей.
Кроме того, тут есть свои ограничения. Например, значение поля, по которому идет индексация, не должно быть больше 1024 байт.
Управление индексами
Все индексы базы данных хранятся в системной коллекции system.indexes. Обратившись к ней, мы можем получить все индексы и связанную с ними информацию:
db.system.indexes.find()
Также мы можем воспользоваться методом getIndexes
и вывести всю информацию об индексах для конкретной коллекции:
db.users.getIndexes()
Данная команда вернет вывод наподобие следующего:
[
{
"v": 1,
"key": {
"_id": 1
},
"ns": "test.users",
"name": "_id_"
},
{
"v": 1,
"key": {
"name": 1
},
"ns": "test.users",
"name": "name_1"
}
]
Как мы видим, здесь для коллекции users (из бд test) определено 2 индекса: id и name. Поле key используется для поиска максимального и минимального значений, для различных операций, где надо применять данный индекс. Поле name применяется в качестве идентификатора для операций администрирования, например, для удаления индекса:
db.users.dropIndex("name_1")