聚合管道操作有一个优化阶段,它试图重塑管道以提高性能。查看优化器如何转换特定的聚合管道,请将 explain 选项包含在 db.collection.aggregate() 方法中。
注意:优化可能会在不同版本之间发生变化
投影优化
投影优化即优化我们应用到管道的数据,减少应用到管道的数据量,一定程度上可以优化性能。
在开始优化之前,你先确定你的聚合管道是否只需要文档中一部分字段就可以获得结果。如果是这样,那么你可以只将需要的字段应用到管道,从而减少通过管道的数据量。这个和优化SQL类似,例如:select * from users;
# 下面性能将更好
select username, password from users;
管道顺序优化
($project 或 $unset 或 $addfield 或 $set)+ $match 顺序优化
对于包含一个投影阶段($project 或 $unset 或 $addFields 或 $set)和一个 $match 阶段的聚合管道,MongoDB 将 $match 阶段中不需要在投影阶段计算值的任何过滤器移动到一个新的 $match 阶段,然后再进行投影。
如果聚合管道包含多个投影和/或 $match 阶段,MongoDB 将对每个 $match 阶段执行此优化,在筛选器不依赖的所有投影阶段之前移动每个 $match 筛选器。
考虑以下几个阶段的管道:{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: {
name: "Joe Schmoe",
maxTime: { $lt: 20 },
minTime: { $gt: 5 },
avgTime: { $gt: 7 }
} }
优化器将 $match 阶段分解为四个单独的过滤器,一个用于 $match 查询文档中的每个键。然后,优化器在尽可能多的投影阶段之前将每个过滤器移动,根据需要创建新的 $match 阶段。考虑到这个示例,优化器产生以下优化的管道:{ $ma

最低0.47元/天 解锁文章

1140

被折叠的 条评论
为什么被折叠?



