关于MongoDB覆盖查询中_id字段索引要求的疑问
关于MongoDB覆盖查询中_id字段索引要求的疑问
嘿,这个问题我当初刚接触覆盖查询的时候也困惑过,咱们一步步捋清楚:
首先得明确什么是覆盖查询:简单说就是MongoDB完全靠索引就能满足你的查询需求,不需要去磁盘上读取原始文档——这样速度会快很多,这也是覆盖查询的核心优势。
那回到你的问题:
- 你创建的索引是
db.inventory.createIndex( { type: 1, item: 1 } ),这个索引里确实没有包含_id字段。 - MongoDB有个默认行为:不管你有没有指定,查询结果里都会自动返回
_id字段,除非你在投影里明确写{_id: 0}把它排除掉。
这时候问题就来了:如果你的查询没有排除_id,MongoDB需要返回这个字段,但它不在你创建的索引里,那它就不得不去原始文档里读取_id的值——这样一来,这个查询就没法完全靠索引完成,自然就不满足覆盖查询的要求了。
那你问的「索引不需要包含_id就能关联回原始文档」是怎么回事?其实MongoDB的每个索引条目里,都会隐式存储对应文档的_id值,这个是MongoDB内部的机制,用来快速定位到原始文档,但这个隐式存储的_id是不能直接作为查询结果返回的——它只是个内部定位用的标识,不是给客户端输出的字段。
总结一下:
- 要让你的索引覆盖查询,必须确保所有需要返回的字段都在索引里;因为默认会返回
_id,而它不在你的索引里,所以必须显式排除它。 - 索引不需要显式包含
_id也能关联回文档,是因为MongoDB内部已经在索引条目里隐式存了_id的定位信息,只是这个信息不会被当作结果返回。
备注:内容来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

