0

我正在尝试做的事情对我来说听起来合乎逻辑,但我不确定。

我正在尝试通过使用 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那是成功的。


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

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


问题:

  1. 为什么索引不起作用,我还有其他事情要做吗?
  2. 在这种情况下,多键索引是否有益?(我假设是的。
  3. 是否有另一种形式的索引会更有益?



编辑:
我刚刚注意到在 RockMongoexplain数据中有一个字段: "isMultiKey": true,
是否正在使用 Multikeys 并且我完全误解了它正在被索引?

4

1 回答 1

1

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

indexOnly描述的是您的查询包含另一个字段 ,name它不是索引的一部分。当查询优化器发现查询的所有元素都可以通过使用索引中的字段来满足时,这称为覆盖查询,并且indexOnly此处的属性设置为 true。

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

于 2014-02-14T00:46:57.020 回答