mongodb: многоключевая структура индексации?

Мне трудно понять, как именно выполняется индексация мультиключей в mongodb.

Вот что я прочитал о мультиключах в документах mongodb на его веб-сайте:
1) «Создание индекса для индексов элементов массива приводит к тому, что база данных индексирует каждый элемент массива»
2) «... будет индексировать все теги в документе и создайте индексные записи для «X», «Y» и «Z» для этого документа».

Итак, что именно это означает под индексными записями для этого документа? Каждый документ запоминает записи, и в этом случае поиск будет полным сканированием таблицы? Или это тот же индекс B-дерева mysql, где каждая запись индекса будет указывать на несколько документов для каждого соответствующего события, и в этом случае я слишком много думаю.

Возьмем пример:

obj1 = { 
    name: "Apollo",
    text: "Some text about Apollo moon landings",
    tags: [ "moon", "apollo", "spaceflight", "nasa" ]
}
obj2 = { 
    name: "Atlantis",
    text: "Some text about Atlantis flight missions",
    tags: [ "space", "atlantis", "spaceflight", "nasa" ]
}
db.articles.ensureIndex( { tags : 1 } )

Пожалуйста, помогите мне понять! Заранее спасибо.


person Ari53nN3o    schedule 13.09.2011    source источник


Ответы (2)


В этом случае ваш индекс (который представляет собой B-дерево) будет выглядеть так:

 apollo => [ obj1 ]
 atlantis => [ obj2 ]
 moon => [ obj1 ]
 nasa  => [ obj1, obj2 ]
 space => [ obj2 ]
 spaceflight => [ obj1, obj2 ]

Это просто «обычный» индекс B-дерева, за исключением того, что каждый документ может появляться более одного раза (он появляется один раз для каждого уникального значения тега).

person Thilo    schedule 13.09.2011
comment
Потрясающий! Спасибо за разъяснения. Вы только что доказали, что я слишком много думал! :) - person Ari53nN3o; 13.09.2011

Я думаю, вы неправильно поняли разницу между мультииндексными и составными индексами:

Составные индексы — это определяемые пользователем индексы для нескольких полей одновременно. Индексы с несколькими ключами: MongoDB определяет, является ли поле, для которого выпускается индекс, массивом, и создает индекс для каждого из элементов массива, например

db.user.ensureIndex({"address.street":1});

В этом случае и поскольку целевое поле является массивом, индекс будет хранить все элементы, но только один раз.

Я настоятельно рекомендую вам взглянуть на эту простую статью, которая прояснит ваши сомнения относительно простых типов imdex в MongoDB: http://mongodbspain.com/en/2014/01/24/mongodb-indexes-part1/

С уважением,

person CesarTrigo    schedule 10.02.2014
comment
Связанный учебник хорош, понимание будет еще лучше с примером, подобным приведенному в ответе Тило. - person Andreas Reiff; 12.11.2014