zoukankan      html  css  js  c++  java
  • mongodb 聚合(Map-Reduce)

      介绍

        Map-reduce 是一种数据处理范式,用于将大量数据压缩为有用的聚合结果。对于 map-reduce 操作,MongoDB 提供MapReduce数据库命令。

        MongoDB中的MapReduce主要有以下几阶段:

        1、Map:把一个操作Map到集合中的每一个文档

        2、Shuffle: 根据Key分组对文档,并且为每个不同的Key生成一系列(>=1个)的值表(List of values)。

        3、Reduce: 处理值表中的元素,直到值表中只有一个元素。然后将值表返回到Shuffle过程,循环处理,直到每个Key只对应一个值表,并且此值表中只有一个元素,这就是MR的结果。

        4、Finalize:此步骤不是必须的。在得到MR最终结果后,再进行一些数据“修剪”性质的处理。

        

      处理过程

      

    db.runCommand({ 
        mapreduce:<collection>, 
        map:<mapfunction>,
        reduce:<reducefunction>,
        [,query:<query filter object>]
        [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]
        [,limit:<number of objects to return from collection>]
        [,out:<see output options below>]
        [,keeptemp:<true|false>]
        [,finalize:<finalizefunction>]
        [,scope:<object where fields go into javascript global scope>]
        [, jsMode : boolean,default true]
        [,verbose:true]
    });

      参数说明:

    • Mapreduce:要操作的目标集合

    • Map:映射函数(生成键值对序列,作为reduce函数参数)

    • Reduce:统计函数

    • Query:目标记录过滤

    • Sort:目标记录排序

    • Limit:限制目标记录数量

    • Out:统计结果存放集合(不指定使用临时集合,在客户端断开后自动删除)

    • Keeptemp:是否保留临时集合

    • Finalize:最终处理函数(对reduce返回结果进行最终整理后存入结果集合)

    • Scope:向map、reduce、finalize导入外部变量

    • jsMode说明:为false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,为true时 BSON-->js-->map-->reduce-->BSON

    • Verbose:显示详细的时间统计信息

      

      执行查询的步骤

    • MapReduce对指定的集合Collection进行查询

    • 对A的结果集进行mapper方法采集

    • 对B的结果执行finalize方法处理

    • 最终结果集输出到临时Collection中

    • 断开连接,临时Collection删除或保留

      以下是来自文档的图,可以清楚的说明 Map-Reduce 的执行过程。 

      

      

        MongoDB中使用emit函数向MapReduce提供Key/Value对。

        Reduce函数接受两个参数:Key,emits. Key即为emit函数中的Key。 emits是一个数组,它的元素就是emit函数提供的Value。

        Reduce函数的返回结果必须要能被Map或者Reduce重复使用,所以返回结果必须与emits中元素结构一致。

        Map或者Reduce函数中的this关键字,代表当前被Mapping文档。

      构造数据:

      

    db.orders.insertMany([{cust_id:'A123',amount:500,status:'A'},
    {cust_id:'A123',amount:250,status:'A'},
    {cust_id:'B212',amount:200,status:'A'},
    {cust_id:'A123',amount:100,status:'D'}])

      执行结果:

      

  • 相关阅读:
    Qt之等待提示框(QTimer)
    Qt之等待提示框(QPropertyAnimation)
    FormatUtil类型格式转换
    FirstLetterUtil
    文件上传下载
    file相关的操作,(md5,word转html,复制,删除等)
    SessionListener失败,退出
    JackJson的一些方法
    全局常量
    session用户账号认证(一个用户登陆,踢出前一个用户)
  • 原文地址:https://www.cnblogs.com/shaosks/p/14207375.html
Copyright © 2011-2022 走看看