请参阅下面的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
第一个explain
有indexOnly : false
而第二个indexOnly : true
虽然两个查询严格相同。
为什么不是db.test.find({info: "info1"})
a covered query?
答案 0 :(得分:4)
我一直在思考和测试这个,现在确实有意义。如果你没有添加任何投影,MongoDB无法“知道”你所拥有的索引是否实际上填满了整个回报;我的意思是如何在不查看文档的情况下知道索引是否涵盖了投影?
它与SQL中的select *
和select d,e
相同。你怎么知道*
与d,e
没有实际相同?
如果您提供投影,那么MongoDB可以“知道”查看索引会为您提供完整的结果集,但是没有投影就不能。
所以经过一番思考后,我认为这不是一个错误,只是一个“怪癖”。