将MongoDB移动到Multikeys但indexOnly返回false

时间:2014-02-14 00:03:23

标签: mongodb indexing mongojs multikey

我想要做的事情听起来合乎逻辑,但我不确定。

我正在尝试使用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. 在这种情况下Multikey索引是否有益? (我假设是。
  3. 是否有其他形式的索引更有益?


  4. 修改
    我刚刚注意到在RockMongo explain数据中有一个字段: "isMultiKey": true,
    可能是Multikeys被使用了,而且我完全误解了它被索引了?

1 个答案:

答案 0 :(得分:1)

正如您在编辑中所说,并且来自解释的部分您未发布的是isMulyiKey: true以及光标上的其他信息显示正在使用索引。 indexBounds是另一个指标。

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

因此,在理想情况下,您的查询和结果仅使用来自索引的信息而MongoDB不会必须查找来自集合中索引的条目,以便返回更多数据。