【问题标题】:Query without projection is not covered不包括没有投影的查询
【发布时间】:2013-03-27 20:30:32
【问题描述】:

参见下面的 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

【问题讨论】:

  • 这很可能是 mongo 查询优化器的并发症,除非有投影,否则优化器不会检查覆盖的索引
  • 补充一下,我会在jira.mongodb.org 上提交这个文件,因为看起来优化器应该在这里尝试使用覆盖查询,但显然优化器没有检测到这一点。
  • 这显然既不是错误也不是怪癖。这两个查询以任何方式、形状或形式都不是“严格等价的”。他们在这个数据集上的结果恰好是“严格等价的”。但是查询本身是完全不同的。一个说“返回整个文档”,另一个说“从文档中返回这两个字段值”。

标签: mongodb indexing mongodb-query


【解决方案1】:

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

与SQL中的select *select d,e相同。不看怎么知道*d,e一样?

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

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

【讨论】:

  • 这确实很有意义。某处可能存在一个文档,其中包含索引未捕获的附加字段。
猜你喜欢
  • 2016-09-29
  • 2014-05-11
  • 1970-01-01
  • 2021-06-25
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多