В MongoDB как вы индексируете поля встроенного объекта в массиве? - PullRequest
27 голосов
/ 30 января 2012

В документации mongodb для мультиключей приведен пример запроса полей встроенного объекта в массиве:

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 для индексации для второго случая?

Ответы [ 2 ]

43 голосов
/ 30 января 2012

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

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

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

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

, а также

db.posts.find( { comments: {$elemMatch: {author : "julie" }}} )
0 голосов
/ 30 января 2012

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

db.[collection].ensureIndex( { [yourArrayField] : 1 } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...