2012-02-16 82 views
3

我有一個MongoDB集合,我想添加索引。爲了這篇文章的目的,我們假設集合名稱是Cats。我對Cats收集的哈希鍵,如果你這樣做db.cats.findOne();它會看起來如下:將索引添加到MongoDB集合哈希字段

> db.cats.findOne(); 
{ 
    "_id" : ObjectId("4f248f8ae4b0b775c9eb002d"), 
    "metaData" : { 
     "type" : "cute", 
     "id" : "4ed3b6c599114b488be52bc3" 
    }, 
     .... 
} 

我查詢經常(使用Mongoid),像這樣的東西:

Cat.first(:conditions => { "metaData.id" => an_id }

我真的很想能夠在這裏利用索引,但我不完全確定是否應該索引所有的metaData或metaData.id(我特別針對id,而且經常查詢)。

會喜歡這個問題的任何解決方案,因爲我認爲如果我在這裏做正確的事情,我可以顯着加快查詢速度。另外,這是一個獨特的索引。

metaData不是嵌入式文檔。它沒有自己的收藏。它只是一個在每個貓對象中都有1:1映射的散列。

回答

4

您可以在嵌入式文檔上定義索引。這是這裏介紹:

http://www.mongodb.org/display/DOCS/Indexes#Indexes-UsingDocumentsasKeys

爲了您的具體的例子,這將是:

db.Cats.ensureIndex({ "metaData.id" : 1}, {unique : true}) 

要比較你的結果做一些在外殼的標準查詢與.explain()來比較有無索引的速度。如果你沒有做太多的查詢,你可能需要提示要使用的索引,以便它不會緩存「最佳」索引(不要忘記默認情況下有_id)。更多解釋信息在這裏:

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