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

mongodb:为什么集合为空时indexOnly=false,mongodb,indexing,Mongodb,Indexing,假设我有一个没有任何集合的空db。然后我运行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:好的,我需要使用投影,因

假设我有一个没有任何集合的空db。然后我运行
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可以从索引中看到没有任何文档与查询匹配,那么它为什么要扫描实际文档呢?

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

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

应该可以工作。

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

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

应该可以工作。

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

此外,如果要使用覆盖索引,则需要使用投影,以便只返回实际上是索引一部分的字段。您可以通过以下方式实现:

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

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

此外,如果要使用覆盖索引,则需要使用投影,以便只返回实际上是索引一部分的字段。您可以通过以下方式实现:

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

实际上,您还需要将
\u id:0
添加到投影中,因为默认情况下总是包含
\u id
。然后,
indexOnly
将变成
true
@vorou-Yeah-true实际上忘记了这一点。实际上,您还需要将
\u-id:0
添加到投影中,因为默认情况下总是包含
\u-id
。然后,
indexOnly
将变为
true
@vorou-Yeah-true实际上忘记了这一点对于ypdate,我想说这很可能是因为文档的
count()
是在读取实际文档本身时完成的,如果没有投影,它将通过查看实际的集合来进行计数。有点猜测,但这似乎是合乎逻辑的,由Dericks Answer暗示,对于ypdate,我认为这很可能是因为文档的
count()
是在读取实际文档本身时完成的,如果没有投影,它将通过查看实际集合来进行计数。有点猜测,但这似乎合乎逻辑,由德里克的回答暗示