美文网首页
五、MongoDB管道——概念篇

五、MongoDB管道——概念篇

作者: 转身丶即天涯 | 来源:发表于2021-10-21 17:12 被阅读0次

    什么是管道?

    了解Linux的同学应该不陌生,管道是将上一条命令产生的结果作为下一条命令的输入,用”|“表示。
    而在MongoDB中也有类似的概念,它的全称是”聚合管道(Aggregate Pipeline)“,异曲同工。

    相关概念

    为了清晰的阐述管道的概念,需要先明确一些相关概念。

    aggregate

    表示聚合管道

    阶段(stage)

    一个aggregate由多个阶段组成。上一阶段产生的结果会作为下一阶段的输入,所以也会被形象的称为流水线(Pipeline)。
    看一个官网的例子:

    db.orders.aggregate([
        { $match: { status: "A" } },
        { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
    ])
    

    stage 1:通过match命令筛选出目标文档。
    stage 2: 然后将筛选出来的文档再通过group命令进行分组,最后通过sum命令对分组后的数据进行累加操作。

    管道表达式

    这个概念相对复杂,以下仅为个人理解。

    • 如果理解编程中“表达式”的概念,所谓“管道表达式”也是异曲同工,就是对文档中的数据的状态做一些转换的公式。
    • 管道表达式只能对管道中当前文档进行操作,并且不能引用其他文档中的数据。
    • 表达式操作都是内存存储的。
    • 表达式是无状态的,只有在聚合时才进行真正的计算。仅有一处例外:累加器表达式 $sum。
    • 表达式是幂等的,在入参相同的情况下,无论计算多少次,返回的结果必然一致。
    聚合管道行为

    在MongoDB中,管道命令在单个集合上运行,从逻辑上将整个集合传递到聚合管道。
    为了尽可能优化操作,请使用一下策略以避免扫描整个集合(类似于MySQL中的全表扫描)。

    管道阶段使用索引
    • match:如果match出现在管道的开始,该阶段可以使用索引来过滤文档。
    • sort:只要前面没有project、unwind、group阶段,$sort就能使用索引。
    • group:如果满足下列所有,group阶段可以使用索引查找每个组中的第一个文档:
      1. group阶段之前是一个sort阶段,该阶段对字段进行分组。
      2. 在分组的字段上有一个索引,它与排序顺序匹配
      3. group阶段中使用的唯一累加器是first
    • geoNear:如果想利用地理空间索引,geoNear必须出现在管道的第一阶段。
    早期过滤

    如果聚合操作仅需要集合中的数据子集,请使用match,limit, skip阶段来限制在管道开头输入的文档。 应该在管道的开头用match操作使用合适的索引,来扫描集合中匹配的文档。

    内部优化阶段

    聚合管道中有内部优化阶段,这是一个大话题,后期再说。
    聚合管道优化

    管道操作符

    管道操作符是用于描述管道各个阶段所做操作的类型。比如match,表示筛选文档,再比如group,表示对文档分组。

    结束

    本篇仅了解管道相关的一些概念,未来会写一篇关于实际操作的博客

    相关文章

      网友评论

          本文标题:五、MongoDB管道——概念篇

          本文链接:https://www.haomeiwen.com/subject/aohtaltx.html