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