从 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 Frameworkexplain
选项提供有关如何处理管道的信息,但不支持与查询executionStats
模式相同级别的详细信息find()
。如果您专注于优化初始查询执行,您可能会发现使用或verbosityfind().explain()
查看等效查询是有益的。executionStats
allPlansExecution
在 MongoDB 问题跟踪器中有一些相关的功能请求需要关注/支持,以帮助优化/配置聚合管道: