为什么multiKey索引会阻止MongoDB中的indexOnly查询?

时间:2013-11-17 19:18:28

标签: mongodb multikey

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

事实证明,如果索引是multiKey索引,我就不能拥有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

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

2 个答案:

答案 0 :(得分:6)

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

  

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

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

答案 1 :(得分:2)

请注意,当您具有indexOnly查询时,必须使用索引 中的信息合成返回的文档。这意味着,如果不查看文档,则必须返回正确的文档。

在multiKey索引的情况下,查询不知道是否返回
{ "a" : 1 }

{ "a" : [ 1 ] }

它可以告诉我"a"的值为1,索引的类型为multiKey。它需要查看文档以判断"a"的类型是数组还是数字。