Imran
Imran

Reputation: 591

In MongoDB how do you index an embedded object fields in an array?

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

Answers (3)

crifan
crifan

Reputation: 14318

now is 2021 year. according to latest Mongodb official doc, should use createIndex

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

Upvotes: 2

Remon van Vliet
Remon van Vliet

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

japrescott
japrescott

Reputation: 5015

you create the index as if you would with a "normal" field;

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

Upvotes: -2

Related Questions