В MongoDB как вы индексируете встроенные объекты в массив?

Документация mongodb для multikeys дает пример запроса полей встроенных объектов в массиве:

http://www.mongodb.org/display/DOCS/Multikeys

Но нет объяснений, как вы создаете индекс для этой ситуации. Создание индекса в массиве, похоже, не работает (используя механизм объяснения, вы можете видеть, что индекс не используется).

Дополнительные детали:

> // find posts where julie commented
> db.posts.find( { "comments.author" : "julie" } )
{"title" : "How the west was won", 
 "comments" : [{"text" : "great!" , "author" : "sam"},
               {"text" : "ok" , "author" : "julie"}],
 "_id" : "497ce79f1ca9ca6d3efca325"}

Если вы делаете db.articles.ensureIndex( { comments: 1 } ) он не будет индексировать подполя объектов комментариев, а скорее сам объект комментариев.

Таким образом, следующий индекс будет использовать индекс:

 > db.posts.find( {comments : { "author" : "julie", "text" : "ok" } } )

Поскольку он ищет объекты комментариев

Но следующее не будет использовать индекс:

 > db.posts.find( { "comments.author" : "julie" } )

Итак, как вы получаете mongodb для индексации для второго случая?

Ответ 1

Вы можете создать следующий индекс:

db.posts.ensureIndex({"comments.author" : 1})

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

db.posts.find( { "comments.author" : "julie" } )

Так же как

db.posts.find( { comments: {$elemMatch: {author : "julie" }}} )

Ответ 2

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

db.[collection].ensureIndex( { [yourArrayField] : 1 } )