不包括投影的查询

时间:2013-04-05 12:13:58

标签: mongodb indexing mongodb-query

请参阅下面的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"}) a covered query

1 个答案:

答案 0 :(得分:4)

我一直在思考和测试这个,现在确实有意义。如果你没有添加任何投影,MongoDB无法“知道”你所拥有的索引是否实际上填满了整个回报;我的意思是如何在不查看文档的情况下知道索引是否涵盖了投影?

它与SQL中的select *select d,e相同。你怎么知道*d,e没有实际相同?

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

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