Reputation: 591
The mongodb documentation for multikeys gives an example of querying embedded object fields in an array:
http://www.mongodb.org/display/DOCS/Multikeys
But there's no explanation on how you create an index for that situation. Creating an index on the array doesn't seem to work (using the explain mechanism you can see the index isn't use).
Additional details:
> // 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"}
If you do db.articles.ensureIndex( { comments : 1 } )
it won't index the subfields of the comments objects but rather only the comments object itself.
So the following would use the index:
> db.posts.find( {comments : { "author" : "julie", "text" : "ok" } } )
Because it's search on the comments objects
But the following wouldn't use the index:
> db.posts.find( { "comments.author" : "julie" } )
So how do you get mongodb to index for the second case?
Upvotes: 38
Views: 36274
Reputation: 14318
now is 2021 year. according to latest Mongodb official doc, should use createIndex
:
db.posts.createIndex({"comments.author" : 1})
Upvotes: 2
Reputation: 18595
You can create the following index :
db.posts.ensureIndex({"comments.author" : 1})
This will index only the author field of the embedded documents. Note that the index will be used for
db.posts.find( { "comments.author" : "julie" } )
As well as
db.posts.find( { comments: {$elemMatch: {author : "julie" }}} )
Upvotes: 54
Reputation: 5015
you create the index as if you would with a "normal" field;
db.[collection].ensureIndex( { [yourArrayField] : 1 } )
Upvotes: -2