MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析
建立下述测试数据,通过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功能及返回格式不一致问题分析的更多相关文章
- 【转载】MongoDB中的MapReduce 高级操作介绍
转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...
- MongoDB中的MapReduce介绍与使用
一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...
- 如何在Mongodb中实现数据超时自动删除功能?
在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们就不 ...
- MongoDB中MapReduce介绍与使用
一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...
- MongoDB 中数据的替换方法实现 --类Replace()函数功能
关键字: MongoDB,Replace,forEach 近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好& ...
- MongoDB中mapReduce的使用
MongoDB中mapReduce的使用 制作人:全心全意 mapReduce的功能和group by的功能类似,但比group by处理的数据量更大 使用示例: var map = function ...
- MongoDB 中聚合统计计算--$SUM表达式
我们一般通过表达式$sum来计算总和.因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种:1,统计符合条件的所有文档的某个字段的总和:2,统计每个文档的数组字段里面的各个数据值的和. ...
- 在MongoDB中实现聚合函数 (转)
随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
- MongoDB中聚合工具Aggregate等的介绍与使用
Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直接使用MongoDB原生的命令操作数据库中的数据,并且按照要求进行聚合 ...
随机推荐
- nyoj 102 次方求摸 快速幂
点击打开链接 次方求模 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测 ...
- SQL行转列汇总
PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...
- 【转】maven POM.xml 标签详解
http://blog.csdn.net/sunzhenhua0608/article/details/32938533 pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现 ...
- 关于litecoin莱特币挖矿、炒作的一点感想
比特币早在一.二年前我就听说过这个词了,还自己试过搭设矿机,因为没找到显卡驱动,也没有人一起搞,所以中途放弃了. 后来就不断听说涨了多少倍,总想着都涨这么多了,错了也就错过了. 周二组会,一帮人兴起又 ...
- docker学习笔记1 -- 安装和配置
技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...
- 学习总结 java Iterator迭代器练习
package com.hanqi.jh; import java.util.*; public class Text3 { public static void main(String[] args ...
- Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上 ...
- 多XML追加操作
假设要统计当前系统中所有的试卷进行分析,试卷是以XML格式存储的,所有这就需要将所有零散的XML文件整合起来,处理成一个完整的XML文件,进行分析, 下面是简单额处理方法: 当前XML文件格式: &l ...
- C++: std::string 与 Unicode 结合
一旦知道 TCHAR 和_T 是如何工作的,那么这个问题很简单.基本思想是 TCHAR 要么是char,要么是 wchar_t,这取决于_UNICODE 的值: // abridged from tc ...
- 【Linux】inode_针对MySQL读写操作在系统层的进一步学习【转】
转自http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘 ...