zoukankan      html  css  js  c++  java
  • (15)mongodb mapReduce的概念及用法

      mapReduce从功能上说类似于RDBMS中的group,它的强大之处在于很好的支持分布式。相比于group、aggregate,mapReduce的用法很简单,其实它的工作原理也很简单,下面介绍一下。

      mapReduce工作分为两步,一是映射,即map,将数据按照某一个规则映射到一个数组里,比如按照type或者name映射,同一个type或者name的数据形成一个数组,二是规约,即reduce,它接收映射规则和数组,然后计算。举例如下:

      1、计算每个栏目的库存总量

      var map=function(){
        emit(this.cat_id,this.goods_number);
      }

      var reduce=function(cat_id,numbers){
        return Array.sum(numbers);
      }

      db.goods.mapReduce(map,reduce,{out:'res'});

      将相同cat_id的goods_number分别映射到各自的数组中;对每一个数组进行求和,执行结果会生成一个res表,该表中保存了执行的结果,如下:

      > db.res.find();
      { "_id" : 2, "value" : 0 }
      { "_id" : 3, "value" : 203 }
      { "_id" : 4, "value" : 3 }
      { "_id" : 5, "value" : 8 }
      { "_id" : 8, "value" : 61 }

    2、计算每个栏目下商品的平均价格

      var map=function(){
        emit(this.cat_id,this.shop_price);
      }
      var reduce=function(cat_id,values){
        return Array.avg(values);
      }
      db.goods.mapReduce(map,reduce,{out:'res'});

      执行结果如下:

      > db.res.find();
      { "_id" : 2, "value" : 823.33 }
      { "_id" : 3, "value" : 1746.0666666666666 }
      { "_id" : 4, "value" : 2297 }
      { "_id" : 5, "value" : 3700 }
      { "_id" : 8, "value" : 75.33333333333333 }
      { "_id" : 11, "value" : 31 }
      { "_id" : 13, "value" : 33.5 }
      { "_id" : 14, "value" : 54 }
      { "_id" : 15, "value" : 70 }

    3、计算每个栏目下商品的平均价格,只统计价格大于100的

      var map=function(){
        emit(this.cat_id,this.shop_price);
      }
      var reduce=function(cat_id,values){
        return Array.avg(values);
      }

      db.goods.mapReduce(map,reduce,{query:{shop_price:{$gt:100}},out:'res'});

      执行结果如下:

      > db.res.find();
      { "_id" : 2, "value" : 823.33 }
      { "_id" : 3, "value" : 1746.0666666666666 }
      { "_id" : 4, "value" : 2297 }
      { "_id" : 5, "value" : 3700 }

    备注:

      Array中的常用方法有如下几种:

      contains、unique、shuffle、tojson、fetchRefs、sum、avg、stdDev,

      可以通过下面的方式查看:for(var key in Array){ print(key); }

      

  • 相关阅读:
    Distribution(F题)---第八届河南省程序设计大赛
    河南省省赛总结
    Wireless Network--poj2236(并查集)
    River Crossing---河南省第六届大学生程序设计竞赛
    Monkey and Banana---hdu1069(dp)
    Bone Collector--hdu2602(01背包)
    节能--河南省第六届大学生程序设计竞赛
    最舒适的路线--河南省第六届大学生程序设计竞赛
    MPEG2简单码流分析
    H.264简单码流分析
  • 原文地址:https://www.cnblogs.com/javasl/p/11333506.html
Copyright © 2011-2022 走看看