2012-02-16 80 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