经过几天的折腾, 终于弄明白了MongoDB mapReduce在和Spring Data配合使用的方法,简单来说,首先要弄清楚什么是Map Reduce,为什么我们要用map reduce做统计,一般来说, 对应sql语句的group by的场景,都需要用到map reduce。 map reduce的map函数和reduce函数都是javascript写的,因此先要在mongo client先跑通,然后再到spring里面集成。 具体如下:
来源 http://xiaofancn.iteye.com/blog/1184712
MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题。
输入是一个key-value对的集合,中间输出也是key-value对的集合,用户使用两个函数:Map和Reduce。
在使用MongoDb的mapreduce功能时,我找Java代码找半天,结果练了半天的Javascript代码。
MongoDb是通过解析“Javascript”代码来计算的。所有我们先用Javascript代码调通,再使用Java代码拼接使用这个MapReduce功能。
-
db.runCommand(
-
{
-
mapreduce:<collection>,
-
map:<mapfunction>,
-
reduce:<reducefunction>
-
[,query:<queryfilterobject>]
-
[,sort:<sortthequery.usefuloptimization>]for
-
[,limit:<numberofobjectstofromcollection>]return
-
[,out:<output-collectionname>]
-
[,keeptemp:<|>]truefalse
-
[,finalize:<finalizefunction>]
-
[,scope:<objectwherefieldsgointojavascriptglobalscope>]
-
[,verbose:]true
-
});
参数说明:
- mapreduce: 要操作的目标集合。
- map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
- reduce: 统计函数。
- query: 目标记录过滤。
- sort: 目标记录排序。
- limit: 限制目标记录数量。
- out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
- keeptemp: 是否保留临时集合。
- finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
- scope: 向 map、reduce、finalize 导入外部变量。
- verbose: 显示详细的时间统计信息
先看看我们的文档结果
我使用上一篇文章插入数据http://xiaofancn.iteye.com/blog/1163200
讲讲我们要实现的功能,就是按照名字name统计记录个数。
-
D:\ProgramFiles\mongodb>bin\mongo
-
MongoDBshellversion:2.0.0
-
connectingto:test
-
>usetest;
-
switchedtodbtest
-
>map=function(){
-
...emit(this.name,{count:1});
-
...};
-
function(){
-
emit(this.name,{count:1});
-
}
-
>reduce=function(key,values){
-
...vartotal=0;
-
...varindex=0;
-
...for(vari=0;i<values.length;i++){
-
...total+=values[i].count;
-
...index=i;
-
...}
-
...return{count:total};
-
...};
-
function(key,values){
-
vartotal=0;
-
varindex=0;
-
for(vari=0;i<values.length;i++){
-
total+=values[i].count;
-
index=i;
-
}
-
return{count:total};
-
}
-
>db.person.mapReduce(map,reduce,{out:"resultCollection"});
-
{
-
"result":"resultCollection",
-
"timeMillis":112,
-
"counts":{
-
"input":10,
-
"emit":10,
-
"reduce":2,
-
"output":2
-
},
-
"ok":1,
-
}
-
>db.resultCollection.find();
-
{"_id":"xiaofancn","value":{"count":3}}
-
{"_id":"小樊","value":{"count":7}}
-
map=function(){
-
emit(this.name,{count:1});
-
};
此函数是形成下面的key-values结构的,emit就是指定key和value的,也是结果的数据结构。
xiaofancn [{count:1},{count:1},{count:1}]
由于name字段为xiaofancn的person有三个,所以形成三个{count:1}数组。
-
reduce=function(key,values){
-
vartotal=0;
-
for(vari=0;i<values.length;i++){
-
total+=values[i].count;
-
}
-
return{count:total};
-
};
reduce函数中参数key和map函数的emit指定的key(this.name)是同一个key(name),values就是map函数形成的values([{count:1},{count:1},{count:1}])
经过reduce函数处理就形成了key和一个最终的{count:3}数据结构。定义好的函数,需要MongoDB执行
-
db.person.mapReduce(map,reduce,{out:"resultCollection"});
-
db.resultCollection.find();
db代表当前的数据库,person当前的文档,mapReduce调用函数,out:是指定输出的文档名称。
好了,会使用Javascript,使用Java就是拼接我们的Javascript代码了。
-
publicvoidMapReduce(){
-
-
DBCollectionpersonColl=mongoOperations.getCollection(mongoOperations
-
.getCollectionName(Person.class));
-
Stringmap="function(){emit(this.name,{count:1});}";
-
-
Stringreduce="function(key,values){";
-
reduce=reduce+"vartotal=0;";
-
reduce=reduce+"for(vari=0;i<values.length;i++){total+=values[i].count;}";
-
reduce=reduce+"return{count:total};}";
-
-
Stringresult="resultCollection";
-
-
MapReduceOutputmapReduceOutput=personColl.mapReduce(map,
-
reduce.toString(),result,null);
-
DBCollectionresultColl=mapReduceOutput.getOutputCollection();
-
DBCursorcursor=resultColl.find();
-
while(cursor.hasNext()){
-
System.out.println(cursor.next());
-
}
-
}
MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题。
输入是一个key-value对的集合,中间输出也是key-value对的集合,用户使用两个函数:Map和Reduce。
在使用MongoDb的mapreduce功能时,我找Java代码找半天,结果练了半天的Javascript代码。
MongoDb是通过解析“Javascript”代码来计算的。所有我们先用Javascript代码调通,再使用Java代码拼接使用这个MapReduce功能。
-
db.runCommand(
-
{
-
mapreduce:<collection>,
-
map:<mapfunction>,
-
reduce:<reducefunction>
-
[,query:<queryfilterobject>]
-
[,sort:<sortthequery.usefuloptimization>]for
-
[,limit:<numberofobjectstofromcollection>]return
-
[,out:<output-collectionname>]
-
[,keeptemp:<|>]truefalse
-
[,finalize:<finalizefunction>]
-
[,scope:<objectwherefieldsgointojavascriptglobalscope>]
-
[,verbose:]true
-
});
参数说明:
- mapreduce: 要操作的目标集合。
- map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
- reduce: 统计函数。
- query: 目标记录过滤。
- sort: 目标记录排序。
- limit: 限制目标记录数量。
- out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
- keeptemp: 是否保留临时集合。
- finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
- scope: 向 map、reduce、finalize 导入外部变量。
- verbose: 显示详细的时间统计信息
先看看我们的文档结果
我使用上一篇文章插入数据http://xiaofancn.iteye.com/blog/1163200
讲讲我们要实现的功能,就是按照名字name统计记录个数。
-
D:\ProgramFiles\mongodb>bin\mongo
-
MongoDBshellversion:2.0.0
-
connectingto:test
-
>usetest;
-
switchedtodbtest
-
>map=function(){
-
...emit(this.name,{count:1});
-
...};
-
function(){
-
emit(this.name,{count:1});
-
}
-
>reduce=function(key,values){
-
...vartotal=0;
-
...varindex=0;
-
...for(vari=0;i<values.length;i++){
-
...total+=values[i].count;
-
...index=i;
-
...}
-
...return{count:total};
-
...};
-
function(key,values){
-
vartotal=0;
-
varindex=0;
-
for(vari=0;i<values.length;i++){
-
total+=values[i].count;
-
index=i;
-
}
-
return{count:total};
-
}
-
>db.person.mapReduce(map,reduce,{out:"resultCollection"});
-
{
-
"result":"resultCollection",
-
"timeMillis":112,
-
"counts":{
-
"input":10,
-
"emit":10,
-
"reduce":2,
-
"output":2
-
},
-
"ok":1,
-
}
-
>db.resultCollection.find();
-
{"_id":"xiaofancn","value":{"count":3}}
-
{"_id":"小樊","value":{"count":7}}
-
map=function(){
-
emit(this.name,{count:1});
-
};
此函数是形成下面的key-values结构的,emit就是指定key和value的,也是结果的数据结构。
xiaofancn [{count:1},{count:1},{count:1}]
由于name字段为xiaofancn的person有三个,所以形成三个{count:1}数组。
-
reduce=function(key,values){
-
vartotal=0;
-
for(vari=0;i<values.length;i++){
-
total+=values[i].count;
-
}
-
return{count:total};
-
};
reduce函数中参数key和map函数的emit指定的key(this.name)是同一个key(name),values就是map函数形成的values([{count:1},{count:1},{count:1}])
经过reduce函数处理就形成了key和一个最终的{count:3}数据结构。定义好的函数,需要MongoDB执行
-
db.person.mapReduce(map,reduce,{out:"resultCollection"});
-
db.resultCollection.find();
db代表当前的数据库,person当前的文档,mapReduce调用函数,out:是指定输出的文档名称。
好了,会使用Javascript,使用Java就是拼接我们的Javascript代码了。
-
publicvoidMapReduce(){
-
-
DBCollectionpersonColl=mongoOperations.getCollection(mongoOperations
-
.getCollectionName(Person.class));
-
Stringmap="function(){emit(this.name,{count:1});}";
-
-
Stringreduce="function(key,values){";
-
reduce=reduce+"vartotal=0;";
-
reduce=reduce+"for(vari=0;i<values.length;i++){total+=values[i].count;}";
-
reduce=reduce+"return{count:total};}";
-
-
Stringresult="resultCollection";
-
-
MapReduceOutputmapReduceOutput=personColl.mapReduce(map,
-
reduce.toString(),result,null);
-
DBCollectionresultColl=mapReduceOutput.getOutputCollection();
-
DBCursorcursor=resultColl.find();
-
while(cursor.hasNext()){
-
System.out.println(cursor.next());
-
}
-
}
分享到:
相关推荐
Spring Data MongoDB API。 Spring Data MongoDB 开发文档。
Spring Data MongoDB中文文档 便宜下载了。
Spring-data-mongodb_1.9.4_API_docs
Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。...
这篇文章就是展示如何使用Java基于MongoDB和Spring Data创建一个CRUD应用。 Spring Data for MongoDB提供了一个类似于基于Sping编程模型的NoSQL数据存储。Spring Data for MongoDB提供了很多特性,它使很多MongoDB的...
Spring Data MongoDB 中文参考文档和Springboot使用例子,其中还介绍了spring-data-mongodb 如何使用mongodb的全文检索。
springdata mongodb api文档、springdata mongodb api文档
spring-data-mongodb-1.8.0.RELEASE(含源码)
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
使用MongoDB和Spring Data创建一个简单的Java 的CRUD应用示例 包含代码及说明
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
spring data mongodb的demo程序,参考App.java中的调用方法,mongodb配置文件在resources目录下,整个项目使用maven,适合初学者学习。
用MongoDB和Spring_Data创建Java应用
11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...
MapReduce应该算是MongoDB操作中比较复杂的了,下面这篇文章主要给大家介绍了关于MongoDB中MapReduce使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
spring mongodb mongodb实例,spring data mongodb 操作实例总结
spring data mongodb代码参考 个人使用
Spring3+Spring-data-mongodb1.5.6示例
14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_ev.rar14、MongoDB存储原理&多文档事务详解_...