Mongo indexing на массивы объектов против объектов

я реализую базу данных контактов, которая обрабатывает довольно много полей. Большинство из них предопределены и могут считаться связанными, но есть пара, которые не являются. Назовем одно из этих полей "группой". В настоящее время мы реализуем его (каждый документ / контакт имеет поле "группы"):

'groups' : {
   152 : 'hi',
   111 : 'group2'
}

но после некоторого чтения мне показалось, что я должен это сделать:

'groups' : [
   { 'id' : 152, 'name' : 'hi' },
   { 'id' : 111, 'name' : 'group2' }
   ...
]

а затем применить индекс db.contact.ensureIndex({'groups.id':1});

мой вопрос в отношении функциональность. Каковы различия между 2 структурами и как фактически построен индекс (это просто индексирование в каждом документе/контакте или это построение полномасштабного индекса, который имеет все группы из всех документов/контактов?).

Я вроде как иду в предположении, что это структурно лучший способ, но если я ошибаюсь, дайте мне знать.

1 ответов


запрос, безусловно, будет намного проще во втором случае, когда "группы" -это массив вложенных документов, каждый с " id " и "name".

Mongo не поддерживает запросы "подстановочный знак", поэтому, если ваши документы были структурированы первым способом, и вы хотели найти вложенный документ со значением" hi", но не знали, что ключ 152, вы не сможете это сделать. Со второй структурой документа вы можете легко запросить {"группы.name": "привет"}.

для дополнительные сведения о запросе внедренных объектов см. В документации под названием " точечная нотация (доступ к объектам)"http://www.mongodb.org/display/DOCS/Dot + обозначение + %28Reaching + в + объекты%29 Также полезны разделы документации "дополнительные запросы ""значение в массиве" и " значение во внедренном объекте: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

для индекса на {'группы.id': 1}, an запись индекса будет создана для каждого ключа "id" в каждом массиве "groups" в каждом документе. С индексом в "группах" будет создана только одна запись индекса для каждого документа.

если у вас есть документы второго типа и индекс по группам, ваши запросы должны будут соответствовать целым вложенным документам, чтобы использовать индекс. Например, учитывая документ:

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }

запрос

db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 

будет использовать индекс, но запросы

db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})

или

db.<collectionName>.find({"groups.name":"hi"})

не будет.

индекс(Ы), который вы создаете, должен зависеть от того, какие запросы вы чаще всего будете выполнять.

вы можете поэкспериментировать с тем, какие (если таковые имеются) индексы используются вашими запросами .команда explain (). http://www.mongodb.org/display/DOCS/Explain первая строка, "курсор" скажет вам, какой индекс используется. "курсор" : "BasicCursor" указывает, что полный выполняется сканирование коллекции.

в документации есть дополнительная информация об индексации: http://www.mongodb.org/display/DOCS/Indexes

раздел "элементы массива индексирования" вышеуказанных ссылок на документ под названием " Multikeys": http://www.mongodb.org/display/DOCS/Multikeys

надеюсь, это улучшит ваше понимание того, как запрашивать встроенные документы и как используются индексы. Пожалуйста, позвольте нам знайте, если у вас есть какие-либо последующие вопросы!