1

请参见下面的 shell 示例(假设 db.test 不存在):

db.test.ensureIndex({info: 1, _id: 1})
db.test.insert({info: "info1"})
db.test.insert({info: "info2"})
db.test.insert({info: "info3"})
db.test.find({info: "info1"}).explain().indexOnly //is false
db.test.find({info: "info1"}, {_id: 1, info: 1}).explain().indexOnly //is true

第一个explainindexOnly : false,而第二个有,indexOnly : true尽管这两个查询是严格等价的。

为什么没有db.test.find({info: "info1"}) 覆盖查询

4

1 回答 1

4

我一直在思考和测试这个,现在它确实有意义。如果您不添加投影,MongoDB 将无法“知道”您拥有的索引是否实际填充了整个返回;我的意思是它如何知道索引覆盖了投影而不查看文档?

select *它与select d,eSQL中的 and 相同。你怎么能知道那*d,e没有实际看的一样呢?

如果您提供投影,那么 MongoDB 可以“知道”查看索引将为您提供完整的结果集,但是,如果没有投影,它就不能。

所以经过一番思考,我认为这不是一个错误,它只是一个“怪癖”。

于 2013-04-05T13:11:13.520 回答