建立下述测试数据,通过MapReduce统计每个班级学生数及成绩和。

代码如下:

public string SumStudentScore()
{
var collection = _dataBase.GetCollection("StudentInfo"); //按照班级(Class)进行分组统计,并将每条记录的记录数(1)和成绩(this.Score)作为Reduce参数
string mapFunction = @"function(){
emit(this.Class,{Count:1,Score:this.Score});
};"; //注意此处Values是分组后的一到多条记录
string reduceFunction = @"function(Class,Values){
var reduced = {SumCount:0,SumScore:0}; Values.forEach(function(val){
reduced.SumCount += val.Count;
reduced.SumScore += val.Score;
});
return reduced;
}"; string outputInfo = string.Empty;
var result = collection.MapReduce(mapFunction, reduceFunction); foreach (var item in result.GetResults())
{
outputInfo += item.ToString() + Environment.NewLine;
} return outputInfo;
}

执行结果如下:

{ "_id" : "11班", "value" : { "SumCount" : 2.0, "SumScore" : 9.0 } }
{ "_id" : "12班", "value" : { "SumCount" : 2.0, "SumScore" : 8.0 } }
{ "_id" : "13班", "value" : { "Count" : 1.0, "Score" : 5.0 } }

可见统计结果没有问题,但是第三个分组13班的返回格式明显不同于前两条,经查阅资料为误用MapReduce所致,MapReduce使用有如下要求:

Reduce方法的Value参数必须与返回结果一致。

再分析上述代码:

Reduce的Values参数是由Map方法emit而来,因此参数格式为:{Count:Number,Score:Number},而Reduce的返回参数格式为:{SumCount:Number,SumScore:Number},格式并不一致,因此导致了上述问题。

修改上述代码,将emit结果与Reduce返回格式保持一致:

public string SumStudentScore()
{
var collection = _dataBase.GetCollection("StudentInfo"); //按照班级(Class)进行分组统计,并将每条记录的记录数(1)和成绩(this.Score)作为Reduce参数
string mapFunction = @"function(){
emit(this.Class,{SumCount:1,SumScore:this.Score});
};"; //注意此处Values是分组后的一到多条记录
string reduceFunction = @"function(Class,Values){
var reduced = {SumCount:0,SumScore:0}; Values.forEach(function(val){
reduced.SumCount += val.SumCount;
reduced.SumScore += val.SumScore;
});
return reduced;
}"; string outputInfo = string.Empty;
var result = collection.MapReduce(mapFunction, reduceFunction); foreach (var item in result.GetResults())
{
outputInfo += item.ToString() + Environment.NewLine;
} return outputInfo;
}

输出结果正确:

{ "_id" : "11班", "value" : { "SumCount" : 2.0, "SumScore" : 9.0 } }
{ "_id" : "12班", "value" : { "SumCount" : 2.0, "SumScore" : 8.0 } }
{ "_id" : "13班", "value" : { "SumCount" : 1.0, "SumScore" : 5.0 } }

参考资料:

关于《来,我给你们看一段神奇的mongodb的mapreduce操作!》的解释

db.collection.mapReduce() — MongoDB Manual 2.6.7

MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析的更多相关文章

  1. 【转载】MongoDB中的MapReduce 高级操作介绍

    转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...

  2. MongoDB中的MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  3. 如何在Mongodb中实现数据超时自动删除功能?

    在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们就不 ...

  4. MongoDB中MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  5. MongoDB 中数据的替换方法实现 --类Replace()函数功能

    关键字: MongoDB,Replace,forEach 近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好& ...

  6. MongoDB中mapReduce的使用

    MongoDB中mapReduce的使用 制作人:全心全意 mapReduce的功能和group by的功能类似,但比group by处理的数据量更大 使用示例: var map = function ...

  7. MongoDB 中聚合统计计算--$SUM表达式

    我们一般通过表达式$sum来计算总和.因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种:1,统计符合条件的所有文档的某个字段的总和:2,统计每个文档的数组字段里面的各个数据值的和. ...

  8. 在MongoDB中实现聚合函数 (转)

    随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...

  9. MongoDB中聚合工具Aggregate等的介绍与使用

    Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直接使用MongoDB原生的命令操作数据库中的数据,并且按照要求进行聚合 ...

随机推荐

  1. POJ 3744 【矩阵快速幂优化 概率DP】

    搞懂了什么是矩阵快速幂优化.... 这道题的重点不是DP. /* 题意: 小明要走某条路,按照个人兴致,向前走一步的概率是p,向前跳两步的概率是1-p,但是地上有地雷,给了地雷的x坐标,(一维),求小 ...

  2. Remove Duplicates from Sorted List(链表)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  3. 动画的特效Interpolator

    AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator  在动画开始的地方速率改变比较慢 ...

  4. 【原】dnsmasq小工具

    1.介绍 DNSmasq是一个轻巧的,容易使用的DNS服务工具,它可以应用在内部网和Internet连接的时候的IP地址NAT转换,也可以用做小型网络的DNS服务. 它可以提供如下几个实用的功能: 1 ...

  5. Android常用知识笔记

    1. 安卓图片自适应 android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能  <supports-screens  android:largeS ...

  6. 关于conversation generation的论文笔记

    对话模型此前的研究大致有三个方向:基于规则.基于信息检索.基于机器翻译.基于规则的对话系统,顾名思义,依赖于人们周密设计的规则,对话内容限制在特定领域下,实际应用如智能客服,智能场馆预定系统.基于信息 ...

  7. cocos2d-x Android版游戏之中国移动SDK嵌入

    . 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...

  8. iOS  Emoji表情编码/解码

    之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d ...

  9. yii中rights安装

    具体安装程序可参考:http://www.focalhot.com/blog/5.html 我在安装过程中一直存在问题,提示表auth_assignment不存在 由于我是将项目中已有的代码复制过来, ...

  10. LED点阵显示名字

    学习了一周的单片机,然后中途有事打断了两周,现在温习一下之前学的东西,用“普中科技单片机”上的LED点阵显示自己的名字. P1接J19(绿).P2接J20(红),P0接J12(数码管段选):5V电压: ...