让我们说我有一个没有任何收藏的空数据库。然后我运行db.qqq.ensureIndex({a:1})
。
在db.qqq.find().explain()
的输出中,我看到BasicCursor
和"indexOnly" : false
。那似乎没问题。
db.qqq.find({a:"somevalue"}).explain()
输出BtreeCursor a_1
,但它也会告诉"indexOnly" : false
。为什么会这样?
为什么给定的索引不足以让mongodb完成我的查询?
UPD :好的,所以我需要使用投影,因为我的索引中没有所有字段。但是我不明白 - 如果Mongo可以从索引中看到没有任何匹配查询的文档,那么为什么要扫描实际文档呢?
答案 0 :(得分:3)
您需要向该查询添加投影,仅索引意味着它从索引中获取所有数据。如果要获取完整的文档,MongoDB不能使用仅索引游标。那就是:
db.qqq.find({a:"somevalue"},{a:1,_id:0}).explain()
应该工作。
答案 1 :(得分:3)
MongoDB在搜索它们之前不知道没有文档,因此它必须至少检查索引是否可以。带有“n = 0”的“BasicCursor”当然不是一件坏事,因为没有读取实际文件(或索引元素,因为没有)。
此外,如果要使用覆盖索引,则需要使用投影,以便仅返回实际上属于索引的字段。你这样做:
db.qqq.find({a:"somevalue"},{a:1,_id:0}).explain()