带驱动程序的 MongoDB
说明
db.collection.explain()返回以下方法的查询计划信息:
返回有关
mapReduce()的信息。要使用
db.collection.explain(),请将上述方法之一附加到db.collection.explain():db.collection.explain().<method(...)> 例如,
db.movies.explain().remove( { rated: "PG" }, { justOne: true } ) 有关更多示例,请参阅示例。 另请参阅 db.collection.explain().help()。
参数
db.collection.explain() 方法具有以下参数:
Parameter | 类型 | 说明 |
|---|---|---|
| 字符串 | 可选。指定解释输出的详细模式。该模式会影响
为实现与早期版本的 |
注意
db.collection.explain() 默认为 queryPlanner,与默认为 allPlansExecution的 explain 命令不同。
兼容性
此方法可用于以下环境中托管的部署:
- MongoDB Atlas :用于在云中部署MongoDB 的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
必需的访问权限
要使用 explain,您必须有权运行根本的命令。
行为
注意
使用 explain 会忽略所有现有的计划缓存条目,并防止 MongoDB 查询计划器创建新的计划缓存条目。
Verbosity 模式
db.collection.explain() 的行为和返回的信息量取决于 verbosity模式。
默认下,db.collection.explain() 以 queryPlanner 详细模式运行。
MongoDB运行查询优化器,为正在评估的操作选择获胜计划。db.collection.explain() 返回被评估方法的 queryPlanner 信息。
MongoDB 运行查询优化器来选择获胜计划并执行获胜计划直至完成,并返回描述获胜计划执行情况的统计信息。
对于写入操作,db.collection.explain() 返回有关将执行的更新或删除操作的信息,但不会将修改应用数据库。
db.collection.explain() 返回已评估方法的 queryPlanner 和 executionStats 信息。但是,executionStats 不提供被拒绝计划的查询执行信息。
MongoDB 运行查询优化器来选择优胜计划并执行该计划直至完成。在 "allPlansExecution" 模式下,MongoDB 返回描述优胜计划执行情况的统计信息以及在计划选择期间捕获的其他候选计划的统计信息。
对于写入操作,db.collection.explain() 返回有关将执行的更新或删除操作的信息,但不会将修改应用数据库。
db.collection.explain() 返回已评估方法的 queryPlanner 和 executionStats 信息。 executionStats 包括获胜计划的已完成查询执行信息。
如果查询优化器考虑了多个计划,executionStats 信息则还包括在计划选择阶段为获胜和被拒计划收集的部分执行信息。
解释和写入操作
对于写入操作,db.collection.explain() 会返回将要执行的写入操作的相关信息,但不会实际修改数据库。
在版本 9.0 中进行了更改:
如果解释针对分片集群上不存在的数据库的写入操作,则该操作不会创建该数据库。
限制
对于包含 $out 阶段的aggregation pipeline,无法在executionStats模式或 allPlansExecution模式下运行explain 命令/ db.collection.explain()。相反,您可以:
在
queryPlanner模式下运行 explain,或者
explain() 机制
db.collection.explain() 方法封装了 explain 命令,是运行explain 的首选方法。
db.collection.explain().find() 与 db.collection.find().explain() 类似,但存在以下主要区别:
db.collection.explain().find()构造允许额外链接查询修饰符。有关查询修饰符的列表,请参阅 db。 集合().find().help()。db.collection.find().explain()返回有关查询计划的explain()信息。
db.collection.explain().aggregate() 相当于将解释选项传递给db.collection.aggregate() 方法。
help()
要查看 db.collection.explain() 支持的操作列表,运行:
db.collection.explain().help()
db.collection.explain().find() 返回一个游标,允许链接查询修饰符。要查看 db.collection.explain().find() 支持的查询修饰符列表以及与游标相关的方法,运行:
db.collection.explain().find().help()
您可以将多个修饰符链接到 db.collection.explain().find()。有关示例,请参阅使用修饰符解释 find()。
分片集群
8.3版本新增。
如果对分片集群上不存在的数据库运行db.collection.explain(),则执行阶段将到达流结束,并且该操作不会创建该数据库。有关流结束执行统计信息的更多信息,请参阅 explain.executionStats.executionStages.isEOF。
输出
db.collection.explain() 操作可以返回以下信息:
explainVersion,输出格式版本(例如"1")。command,其中详细说明了要解释的命令。queryShapeHash,从MongoDB 8.0 开始,是一个十六进制 string,具有查询结构的哈希值。有关详情,请参阅查询结构、查询结构哈希和explain.queryShapeHash。queryPlanner,其详细说明了查询优化器选择的计划,并列出了被拒绝的计划。executionStats,其中详细说明了获胜计划的执行情况以及被拒计划。serverInfo,提供有关 MongoDB 实例的信息。serverParameters,其中详细说明了内部参数。
详细模式(例如 queryPlanner、executionStats、allPlansExecution )决定了结果是否包括 executionStats,以及 executionStats 是否包括计划选择期间捕获的数据。
解释输出会受到 BSON 文档的最大嵌套深度的限制,即 100 级嵌套。解释超出限制的输出会被截断。
有关输出的详细信息,请参阅解释结果。
示例
queryPlanner 模式
默认下,db.collection.explain() 以 "queryPlanner" 详细模式运行。
以下示例在 "queryPlanner" 详细模式下运行 db.collection.explain(),以返回指定 count() 操作的查询计划信息:
db.movies.explain().count( { year: { $gt: 2000 } } )
executionStats 模式
以下示例在 "executionStats" 详细模式下运行 db.collection.explain(),以返回指定 find() 操作的查询计划和执行信息:
db.movies.explain("executionStats").find( { year: { $gt: 2000 }, rated: "PG" } )
allPlansExecution 模式
以下示例在 "allPlansExecution" 详细模式下运行 db.collection.explain()。 db.collection.explain() 返回指定 findAndModify() 操作的所有考虑计划的 queryPlanner 和 executionStats:
注意
执行该解释不会修改数据,但会运行更新操作的查询谓词。对于候选计划,MongoDB 会返回在计划选择阶段捕获的执行信息。
db.movies.explain( "allPlansExecution" ).findAndModify( { query: { rated: "PG", year: { $gt: 2000 } }, sort: { year: 1 }, update: { $inc: { "imdb.votes": 1 } } } )
用修饰符解释 find()
db.collection.explain().find() 构造允许链接查询修饰符。示例,以下操作提供有关带有 sort() 和hint()查询修饰符的 find() 方法的信息。
db.movies.explain("executionStats").find( { year: { $gt: 2000 }, rated: "PG" } ).sort( { year: -1 } ).hint( { rated: 1, year: -1 } )
有关可用查询修饰符的列表,请在 mongosh 中运行以下命令:
db.collection.explain().find().help()
使用 finish() 方法访问 explain() 结果
db.collection.explain().find() 返回 explain() 结果。如果在 mongosh 中以交互方式运行,则可以使用 .finish() 方法访问权限查询计划:
db.movies.explain().find( { rated: "PG" } ).finish().queryPlanner.winningPlan