1

假设我有一个没有任何集合的空数据库。然后我跑db.qqq.ensureIndex({a:1})

db.qqq.find().explain()I see BasicCursorand的输出中"indexOnly" : false。这似乎没问题。

db.qqq.find({a:"somevalue"}).explain()输出BtreeCursor a_1,但它也告诉"indexOnly" : false。为什么会这样?

为什么给定的索引不足以让 mongodb 完成我的查询?

UPD:好的,所以我需要使用投影,因为我的索引中没有所有字段。但是我不明白——如果 Mongo 可以从索引中看到没有任何文档匹配查询,那么它为什么要扫描实际文档呢?

4

2 回答 2

3

MongoDB 在搜索文档之前并不知道没有文档,因此如果可以的话,它至少必须检查索引。“n=0”的“BasicCursor”当然不是一件坏事,因为没有读取实际的文档(或索引元素,因为没有)。

此外,如果要使用覆盖索引,则需要使用投影,以便仅返回实际上是索引一部分的字段。你这样做:

db.qqq.find({a:"somevalue"},{a:1,_id:0}).explain()
于 2013-07-11T07:32:40.037 回答
3

您需要向该查询添加投影,索引仅意味着它从索引中获取所有数据。如果要取回完整文档,MongoDB 不能使用仅索引游标。所以即:

db.qqq.find({a:"somevalue"},{a:1,_id:0}).explain()

应该管用。

于 2013-07-11T07:13:03.013 回答