• mongo-aggregate命令详解


    一、aggregate执行流程和特性 

       1、执行流程:

       db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果;

    下图来自官方文档截图,作为aggregate运行过程图,方便大家了解;

      

      2、特性:

          db.collection.aggregate();

      1. 可以进行多管道操作,能方便进行数据处理;
      2. 使用了mongodb内置的原生sql操作,聚合效率非常高,支持类似于mysql中的group by功能;
      3. 每个阶段管道限制为100MB的内存。如果一个节点管道超过这个极限,MongoDB将产生一个错误。为了能够在处理大型数据集,可以设置allowDiskUse为true来在聚合管道节点把数据写入临时文件。这样就可以解决100MB的内存的限制;
      4. 可以作用在分片集合,但结果不能输在分片集合,MapReduce可以 作用在分片集合,结果也可以输在分片集合
      5. 方法可以返回一个指针(cursor),数据放在内存中,直接操作。跟Mongo shell 一样指针操作;
      6. 输出的结果只能保存在一个文档中,BSON Document大小限制为16M。可以通过返回指针解决,版本2.6中后面:DB.collect.aggregate()方法返回一个指针,可以返回任何结果集的大小;      

     二、aggregate语法: db.collection.aggregate(pipeline, options)

        [pipeline参数]

        $group : 将集合中的文档分组,可用于统计结果,$group首先将数据根据key进行分组;

        $project:可以对输入文档进行添加新字段或删除现有的字段,可以自定哪些字段显示与不显示;

        $match :根据条件用于过滤数据,只输出符合条件的文档,如果放在pipeline前面,根据条件过滤数据,传输到下一个阶段管道,可以提高后续的数据处理效率。还可以放在out之前,对结果进行再一次过滤;

        $redact :字段所处的document结构的级别;

        $limit :用来限制MongoDB聚合管道返回的文档数;

        $skip :在聚合管道中跳过指定数量的文档,并返回余下的文档;

        $unwind :将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值;

        $sample :随机选择从其输入指定数量的文档。如果是大于或等于5%的collection的文档,$sample进行收集扫描,进行排序,然后选择顶部的文件。因此,$sample 在收集阶段是受排序的内存限制 语法:{ $sample: { size: <positive integer> } }

        $sort :将输入文档排序后输出;

        $geoNear:用于地理位置数据分析;

        $out :必须为pipeline最后一个阶段管道,因为是将最后计算结果写入到指定的collection中;

              $indexStats :返回数据集合的每个索引的使用情况;语法:{ $indexStats: { } }

        

                             [pipeline例子]

                        插入test数据(红色区域表示插入成功)

    [$group] 

    _id 是要进行分组的key,如果_id为null  相当于select  count(*) from table;

    $sum:

    统计test_order表条数 ==  'select count(*) as count from test_order';

    统计test_order表 order_price总和  == 'select sum(order_price) as total_order_price from test_order';

    统计test_order表不同订单的order_price总和 == 'select sum(order_price) as total_order_price from test_order group by order_type';

    $min、$max :

    统计test_order表中order_price最大价格和最小价格,不同订单的最大值和最小值 == 'select max(order_price) as order_type_max_price from test_order group by order_type';

    $avg

    统计test_order表中order_price平均价格 和不同订单的平均价格 == 'select avg(order_price) as order_type_avg_price from test_order group by order_type';

    $push、$addToSet

    列举出test_order表中不同类型的订单价格 数据都不要超出16M

    $first、$last 

    统计test_order表中不同订单的第一条和最后一条的订单价格(如果有排序则按照排序,如果没有取自然first和last)

     [$project]

     根据需求去除test_order不需要展示的字段

     

    [$match]

    查询不同订单售卖的总价格,其中总价格大于100的== 'select sum(order_price) as order_type_sum_price from test_order group by order_price having order_type_sum_price > 100';

     查询order_type=3的总价 = 'select sum(order_price) as total_price' from test_order where order_type = 3';

    [$limit、$skip]

    查询限制条数,和跳过条数可以使用在阶段管道用在$group 之前可以大大的提高查询性能

    [$unwind]

    可以拆分数组类型字段,其中包含数组字段值

     [$out]

    是把执行的结果写入指定数据表中

      

                             [options例子] 

    explain:返回指定aggregate各个阶段管道的执行计划信息

        

        

       

       

             

        

      

        

  • 相关阅读:
    插入节点方法appendChild和insertBefore
    大河剧《独眼龙政宗》梵天丸喜多对话台词
    ie6绝对定位层元素消失
    strtok函数相关理解
    [创建型模式] Prototype
    用C实现旋转棒进度条指示器
    使用不规则数组(ragged array)和agetline()将整个文件读入内存
    [创建型模式] AbstractFactory
    xcode_4_and_ios_sdk_4.3__final相关下载地址
    [创建型模式] Singleton
  • 原文地址:https://www.cnblogs.com/xiexiang168/p/8484919.html
Copyright © 2020-2023  润新知