根据文档,当索引覆盖查询时,MongoDB 应跳过 FETCH 阶段。
\n如果我理解正确的话,这句话解释了这种行为:
\n\n\n覆盖查询 当索引覆盖查询时,MongoDB 既可以匹配查询条件,又可以仅使用索引键返回结果;\ni.e. MongoDB 不需要检查集合中的文档来\n返回结果。
\n当索引覆盖查询时,解释结果有一个 IXSCAN 阶段,\n该阶段不是 FETCH 阶段的后代,并且在executionStats 中,\ntotalDocsExamined 为 0。
\n在 MongoDB 的早期版本中,cursor.explain() 返回\nindexOnly 字段来指示索引是否覆盖查询。\n( https://docs.mongodb.com/manual/reference/explain-results/ )
\n
和这个
\n\n\n这样,查询耗时不到 2 毫秒。由于索引\n\xe2\x80\x98 覆盖了\xe2\x80\x99 查询,MongoDB 能够匹配查询条件\n并仅使用索引返回结果钥匙;甚至不需要检查集合中的文档来返回结果。(如果您在执行计划中看到 IXSCAN 阶段不是 FETCH 阶段的子级,则索引 \xe2\x80\x98 覆盖\xe2\x80\x99 查询。)( https://studio3t.com /知识库/文章/mongodb-index-strategy/)
\n
但在测试场景中它不会发生:
\n测试示例:
\n db.Test.insert({"Field1":"data on field1: 1","Field2":"data on field2: 1"});\n db.Test.insert({"Field1":"data on field1: 2","Field2":"data on field2: 2"});\n db.Test.insert({"Field1":"data on field1: 3","Field2":"data on field2: 3"});\n db.Test.insert({"Field1":"data on …Run Code Online (Sandbox Code Playgroud)