我想要做的事情听起来合乎逻辑,但我不确定。
我正在尝试使用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"
]
]
}
}
的的问题:
修改
我刚刚注意到在RockMongo explain
数据中有一个字段:
"isMultiKey": true,
可能是Multikeys被使用了,而且我完全误解了它被索引了?
答案 0 :(得分:1)
正如您在编辑中所说,并且来自解释的部分您未发布的是isMulyiKey: true
以及光标上的其他信息显示正在使用索引。 indexBounds
是另一个指标。
indexOnly所描述的内容是您的查询包含另一个字段name
,该字段不是索引的一部分。当查询优化器通过使用索引中的字段看到查询的所有元素都可以满足时,这被称为covered query,此处的indexOnly
属性为设置为true。
因此,在理想情况下,您的查询和结果仅使用来自索引的信息而MongoDB不会也必须查找来自集合中索引的条目,以便返回更多数据。