mongodb:当集合为空时,为什么indexOnly = false

时间:2013-07-11 05:21:35

标签: mongodb indexing

让我们说我有一个没有任何收藏的空数据库。然后我运行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可以从索引中看到没有任何匹配查询的文档,那么为什么要扫描实际文档呢?

2 个答案:

答案 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()