mongodb聚合查询优化_MongoDB 聚合管道优化

聚合管道操作有一个优化阶段,它试图重塑管道以提高性能。查看优化器如何转换特定的聚合管道,请将 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值