Запросы, безусловно, будут намного проще во втором случае, где «groups» - это массив поддокументов, каждый из которых имеет «id» и «name».
Mongo не поддерживает «подстановочные» запросы, поэтому, если ваши документы были структурированы первым способом, и вы хотели найти поддокумент со значением «hi», но не знали, что ключ был 152,Вы не сможете сделать это.Со второй структурой документа вы можете легко запросить {"groups.name": "hi"}.
Для получения дополнительной информации о запросах встроенных объектов см. Документацию под названием «Точечная нотация (доступ к объектам)» * http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 Разделы «Значение в массиве» и «Значение во встроенном объекте»документации «Расширенные запросы» также полезны: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
Для индекса {'groups.id': 1} будет создана запись индекса для каждого ключа «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
Надеюсь, это улучшит ваше понимание того, как запрашивать встроенные документы и как используются индексы.Пожалуйста, дайте нам знать, если у вас есть дополнительные вопросы!