2014-02-14 34 views
0

我试图做的事对我来说听起来合乎逻辑,但我不确定。将MongoDB移动到Multikeys,但indexOnly返回false

我想通过使用Multikeys来改进部分MongoDB集合。

例如:我有一个具有以下格式的多个文件:

文件:

{ 
    "_id": ObjectId("528a4177dbcfd00000000013"), 
    "name": "Shopping", 
    "tags": [ 
    "retail", 
    "shop", 
    "shopping", 
    "store", 
    "grocery" 
    ] 
} 


查询:
到现在为止,我一直在使用下面的查询以匹配tags字段。

var tags = Array("store", "shopping", "etc"); 
db.collection.findOne({ 'tags': { $in: tags } }, { name: true }); 

这一直运作良好,但我觉得应该Multikeys在这种情况下被用来提高速度&性能。请纠正我,如果我错了!


索引:
我企图指数tags发出以下命令。

db.collection.ensureIndex({ tags: 1 }, { safe: true }, function(err, doc) {}); 

ensureIndex成功。


结果:
但是使用上述查询RockMongo的explain功能时,其结果是:

{ 
    "indexOnly": false, 
    "indexBounds": { 
    "tags": [ 
     [ 
     "etc", 
     "etc" 
     ], 
     [ 
     "shopping", 
     "shopping" 
     ], 
     [ 
     "store", 
     "store" 
     ] 
    ] 
    } 
} 


问题:

  1. 为什么索引不能正常工作,还有什么我不得不做的吗?
  2. 在这种情况下多键索引是有益的吗? (我假设是的,
  3. 是否有另一种索引的形式会更有益?



编辑:
我刚刚注意到,在RockMongo explain数据有一个字段: "isMultiKey": true,
那也许是因为正在使用Multikeys和我已经完全误解了它被索引?

回答

1

正如你在你的编辑中所说的,并且来自你没有发布的解释部分,isMulyiKey: true以及关于游标的其他信息显示正在使用该索引。 indexBounds是另一个指标。

indexOnly正在描述的是,您的查询包含另一个字段name,该字段不是索引的一部分。当查询优化器通过使用索引内的中的字段可以满足查询的所有元素时,这被称为covered query,并且此处的indexOnly属性设置为true。

理想情况查询

所以和结果使用从索引的信息仅和MongoDB不要回去看看从索引集合中的条目,以返回更多的数据。

相关问题