MongoDBAggregate之优化

更新时间:2023-07-06 11:11:09 阅读: 评论:0

MongoDBAggregate 之优化
到aggregate()总是头⼤,不知道怎么写才能达到奥林匹克精神(更⾼,更快,更强)
经过四分卫⼤神指点并结合官⽅⽂档,特对aggregate书写顺序总结如下:
聚合管道的优化
聚合管道操作中有这样⼀个优化阶段,它会尝试改造管道以提升性能。
如要了解优化器如何转换⼀个给定的聚合管道,可以查看 db.collection.aggregate() ⽅法中的 说明 选项的输出结果。 ·具体的优化内容按不同版本的变化⽽定。
预测优化
聚合管道可以检测到是否仅使⽤⽂档中的⼀部分字段就可以完成聚合。如果是的话,管道就可以仅使⽤这些必要的字段,从⽽减少进⼊管道的数据量。
·管道顺序的优化
·$sort + $match 顺序优化
如果你的管道中, $sort 后⾯跟着 $match ,把 $match 移到 $sort 前⾯可以减少需要排序的对象个数。
例如,如果管道中有以下两个部分:
{ $sort : { age : -1 } },{ $match : { status : 'A' } }
//·在优化阶段,优化器⾸先把顺序转换成如下样⼦:
{ $match : { status : 'A' } },{ $sort : { age : -1 } }
$skip + $limit 顺序优化
rearwindow
如果你的管道中, $skip 后⾯跟着 $limit ,优化器会把 $limit 移到 $skip 前⾯,这个时候, $limit 的值会加上 $skip 的个数。·例如,如果管道由以下部分组成:
{ $skip : 10 },{ $limit : 5 }
在优化阶段,优化器⾸先把顺序转换成如下样⼦:
{ $limit : 15 },{ $skip : 10 }
对于类似 limit的合并 ,例如 $sort + $skip + sort和$limit的合并 ,也可以在 skip、$limit的顺序优化 中查看例⼦。westinghou
对于在 分⽚集合上的聚合 ,优化器可以减少从每个分⽚返回的⽂档个数。
·$redact + $match 顺序优化
如果可能,当管道中 $redact 阶段后⾯紧接着有 $match 操作,聚合有时候会添加⼀个 $match 到 $redact前⾯。
如果在管道在⼀开始有 $match ,聚合操作在查询时可以使⽤索引,以减少进⼊到管道中的⽂档个数。更多详情请查看 聚合管道的操作符和性能 。
·例如,如果管道由以下部分组成:
{ $redact : { $cond : { if : { $eq : [ "$level", 5 ] }, then : "$$PRUNE", el : "$$DESCEND" } } },{ $match : { year : 2014, category : { $ne : "Z" } } }//优化器可以在 $redact 之前增加相同的 $match 。
{ $match : { year : 2014 } },{ $redact : { $cond : { if : { $eq : [ "$level", 5 ] }, then : "$$PRUNE", el : "$$DESCEND" } } },{ $match : { year : 2014, category : { $ne : "Z" } } }
管道合并优化
优化器可以在管道开始之前合并其他的管道。⼀般情况下,合并发⽣在所有顺序优化之后。
$sort + $limit 合并
如果 $sort 在 $limit 前⾯,优化器可以把 $limit 合并在 $sort 内部。此时如果指定了限定返回 n 个结果,那么排序操作仅需要维护最前⾯的 n 个结果,MongoDB只需要在内存中存储 n 个元素 (当 allowDiskU 设置为 true 和 n 数⽬超过 聚合的内存限制 时,优化依旧会进⾏。)。更多信息请查看 排序与内存 。
学位英语考试时间
zolasort 和limit ,优化器允许你做很多优化。详情请查看sort 、
$limit + $limit 合并
当 $limit 操作后⾯还有⼀个 $limit 操作,这两步可以合并成⼀个单独的 $limit 操作,此时限制的个数是前⾯两个限制个数中较⼩的值。例如,⼀个管道操作包含有如下操作序列:
{ $limit : 100 },{ $limit : 10 }
/
/此时,第⼆个 $limit 操作可以合并到第⼀个 $limit 操作中,最后⽣成⼀个 $limit 操作并且限制个数为初始两个限制个数 100 和 10 中的较⼩的⼀个 10 。{ $limit : 10 }
$skip + $skip 合并
当 $skip 操作后⾯还有⼀个 $skip 操作,这两步可以合并成⼀个单独的 $skip 操作,此时跳过的个数是前⾯两个跳过个数的和。例如,⼀个管道操作包含有如下操作序列:
{ $skip : 5 },{ $skip : 2 }
//此时,第⼆个 $skip 操作可以合并到第⼀个 $skip 操作中,最后⽣成⼀个 $skip 操作并且跳过个数为初始两个跳过个数 5 与 2 的相加值 7 。
{ $skip : 7 }
$match + $match 合并
当 $match 操作后⾯还有⼀个 $match 操作,可以将这两步中的条件使⽤ match 操作。例如,⼀个管道操作包含有如下操作序列:
{ $match : { year : 2014 } },{ $match : { status : "A" } }
此时,第⼆个 $match 操作可以合并到第⼀个 $match 操作中,最后⽣成⼀个 $match 操作。
{ $match : { $and : [ { "year" : 2014 }, { "status" : "A" } ] } }
·例⼦
下⾯的⼀些顺序优化的例⼦可以结合顺序重排和合并的优势。⼀般来说,合并优化在所有的顺序重排之后进⾏。
$sort + $skip + $limit 顺序
⼀个依次包含 $sort 、 $skip 和 $limit 的管道:
{ $sort : { age : -1 } },{ $skip : 10 },{ $limit : 5 }
·⾸先,优化器执⾏ $skip 和$limit 的优化 ,转换后的顺序如下:
简单祛痘
{ $sort : { age : -1 } },{ $limit : 15 }{ $skip : 10 }
经过 limit的优化 后, $limit 的限定个数会增长。详情请查看 limit的优化 。
kingman>barf重排后的 $sort 在 sort和$limit的合并$limit + $skip + $limit + $skip 顺序kuso是什么意思
管道中如果交替包含了 $limit 和 $skip :
{ $limit : 100 },{ $skip : 5 },{ $limit : 10 },{ $skip : 2 }
//The $skip + $limit 顺序优化 revers the position of the { $skip: 5 } and { $limit: 10 } stages and increas the limit amount:建筑工程管理
handsome什么意思{ $limit : 100 },{ $limit : 15},{ $skip : 5 },{ $skip : 2 }
优化器会把两个 $limit 合并为⼀个 $limit ,两个 $skip 合并为⼀个 $skip 。合并后的结果如下:
{ $limit: 15 },{ $skip: 7 }
详情请查看 limit的合并 和 skip的合并 。and 表达式合并成⼀个单独的skip 和skip 和limit 前⾯,这时可以将这两个阶段合并来降低排序时需要的内存⼤⼩。详情请查看limit 和skip 和

本文发布于:2023-07-06 11:11:09,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/168809.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:管道   优化   操作   聚合   合并   顺序
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图