我试图在从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?
答案 0 :(得分:6)
如果集合中任何文档中的任何索引字段包含数组,则索引无法覆盖查询。如果索引字段是数组,则索引将成为多键索引索引,并且不支持覆盖查询。
您正在将一个数组插入到测试集合中,因此当mongo创建索引时,它必须创建一个MultiKey索引(这意味着它正在为该数组的每个项创建索引)。
答案 1 :(得分:2)
请注意,当您具有indexOnly查询时,必须使用索引 中的信息合成返回的文档。这意味着,如果不查看文档,则必须返回正确的文档。
在multiKey索引的情况下,查询不知道是否返回
{ "a" : 1 }
或
{ "a" : [ 1 ] }
它可以告诉我"a"
的值为1,索引的类型为multiKey。它需要查看文档以判断"a"
的类型是数组还是数字。