4

我在从 MongoDB 的集合中读取数据时尝试仅使用索引,因为我有一些大文档,而对于这个查询,我只需要一个字段。

事实证明,如果索引是多键索引,我不能让 indexOnly = true 。

这是我做的测试:

db.test.drop()
db.test.insert({a:1})
db.test.ensureIndex({a:1})
db.test.find({a:1}, {_id:0, a:1}).explain()

-> indexOnly = true,isMultiKey = false

db.test.insert({a : [2,3]})
db.test.find({a:1}, {_id:0, a:1}).explain()

-> indexOnly = false,isMultiKey = true

文档提到了多键索引的一些限制,但没有提到这一点。有人知道如何同时使用多键和 indexonly 吗?

4

2 回答 2

6

来自:http ://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/#create-indexes-that-support-covered-queries

如果集合中任何文档中的任何索引字段包含数组,则索引无法覆盖查询。如果索引字段是数组,则索引成为多键索引索引,不能支持覆盖查询。

您正在将一个数组插入到您的测试集合中,因此当 mongo 创建索引时,它必须创建一个 MultiKey 索引(这意味着它正在为数组的每个项目创建索引)。

于 2013-11-17T19:36:23.200 回答
2

请注意,当您有 indexOnly 查询时,返回的文档必须从 index only中的信息合成出来。这意味着在不查看文档的情况下,必须返回正确的准确文档。

在多键索引的情况下,查询不知道是返回
{ "a" : 1 }
还是
{ "a" : [ 1 ] }

它所能告诉的只是它"a"的值为 1 并且 index 是 multiKey 类型。它需要查看文档来判断的类型"a"是数组还是数字。

于 2013-11-17T19:37:02.090 回答