从MongoDB 3.0版开始,只需更改顺序即可
collection.aggregate(...).explain()
至
collection.explain().aggregate(...)
将为您提供所需的结果(此处的文档)。
对于> = 2.6的旧版本,您将需要使用该explain
选项进行聚合管道操作
explain:true
db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)
与聚合框架的一个重要考虑是,索引只能用于获取用于管道的初始数据(例如使用情况 $match
,$sort
,$geonear
在管道的开始处),以及随后的 $lookup
和$graphLookup
阶段。一旦将数据提取到聚合管道中进行处理(例如,通过诸如$project
,$unwind
和等阶段$group
),则将在内存中进行进一步的操作(如果allowDiskUse
设置了该选项,则可能使用临时文件)。
优化管道
通常,您可以通过以下方法优化聚合管道:
- 启动一个
$match
阶段以将处理限制在相关文档中。
- 确保初始
$match
/ $sort
阶段得到有效索引的支持。
- 过滤数据早期使用
$match
,$limit
和$skip
。
- 最小化不必要的阶段和文档操作(如果需要复杂的聚合体操,则可能重新考虑您的架构)。
- 如果您已经升级了MongoDB服务器,请利用更新的聚合运算符。例如,MongoDB 3.4添加了许多新的聚合阶段和表达式,包括对处理数组,字符串和构面的支持。
根据您的MongoDB服务器版本,还会自动进行多种聚合管道优化。例如,相邻阶段可以合并和/或重新排序以改善执行,而不会影响输出结果。
局限性
与MongoDB 3.4一样,Aggregation Framework explain
选项提供有关如何处理管道的信息,但不支持与查询executionStats
模式相同的详细程度find()
。如果您专注于优化初始查询的执行,则可能会发现find().explain()
用executionStats
或allPlansExecution
详细检查等效查询会有所帮助。
MongoDB问题跟踪器中有一些相关的功能请求需要监视/更新,这些请求涉及更详细的执行统计信息,以帮助优化/配置聚合管道: