从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版本,聚合框架explain
选项提供了有关管道处理方式的信息,但不支持与find()
查询的executionStats
模式相同级别的详细信息。如果您专注于优化初始查询执行,您可能会发现检查具有executionStats
或allPlansExecution
冗长度的等效find().explain()
查询是有益的。
在MongoDB问题跟踪器中需要关注/点赞几个相关的功能请求,以帮助优化/分析聚合管道的更详细的执行统计信息:
$sort
对象不应该在管道数组内吗? - JohnnyHK