reduce 命令

db.runCommand(
{
mapReduce: <collection>,
map: <function>,
reduce: <function>,
finalize: <function>,
out: <output>,
query: <document>,
sort: <document>,
limit: <number>,
scope: <document>,
jsMode: <boolean>,
verbose: <boolean>,
bypassDocumentValidation: <boolean>
}
)
  1. mapReduce 你要做并行处理的集合名字
  2. map: 分组依据, emit(key,value) => key => group的key,value => 是你key的数组 key=25, values=【“jack","mary"]
  3. reduce: function(key,values) 里面有两个参数, 第一个参数是key:group操作的key,第二个参数是values: 我们刚才说到的 【数组】,类似group中的finalize函数。
  4. finalize: 这个呢,还是和group中的 finalize 一样,会对每组的结构进行一个最后修改。也可以不修改。
  5. out: 就是我们进行mapreduce之后,将结果存放的位置,一般是“集合类型“。
  6. query: 这个很简单,和group的query一样
  7. sort: 一样的到底,对map操作之前的文档进行排序。
  8. limit: 在map之前限制文档的个数
  9. scope: 给reduce,query之类的函数提供变量访问。
  10. 我们常用到的是: mapReduce, map,reduce, out,query,

二:我们看一下注意事项

我们还是用一个person集合,其中有name和age。

上一节课程我们将group的时候,做了一个对age进行分组的一个例子

{age:26,count:2}
{age:29,count:2}
{age:31,count:2}
  1. 第一步:插入数据源
> db.person.find()
{ "_id" : ObjectId("5678a3fc763ea69ae9780c62"), "name" : "mary", "age" : 26 }
{ "_id" : ObjectId("5678a403763ea69ae9780c63"), "name" : "jackson", "age" : 26 }
{ "_id" : ObjectId("5678a40a763ea69ae9780c64"), "name" : "john", "age" : 29 }
{ "_id" : ObjectId("5678a410763ea69ae9780c65"), "name" : "hxc", "age" : 31 }
{ "_id" : ObjectId("5678a416763ea69ae9780c66"), "name" : "mongodb", "age" : 31 }
{ "_id" : ObjectId("5678a41d763ea69ae9780c67"), "name" : "redis", "age" : 29 }
  1. 执行命令
 db.runCommand({
mapreduce:"person",
map:function(){
emit(this.age,this.name); //相当于group的key
},
reduce:function(key,values){ //{key:26,values:["mary","jackson"]}
return {"key":key,"values":values};
},
finalize:function(key,values){
return {"age":key,"count":values.length};
},
out:"t" //最终的存放结果
}) db.runCommand({
mapreduce:"person",
map:function(){
emit(this.age,this.name);
},
reduce:function(key,values){
return {"key":key,"values":values};
},
out:"t"
}) db.runCommand({
mapreduce:"person",
map:function(){
emit(this.age,this.name)
},
reduce:function(key,values){
return values.length;
},
out:"t",
finalize:function(key,values){
return values;
},
query:{"$where":function(){return this.age>28}}
})
db.person.find()
{ "_id" : ObjectId("5678a3fc763ea69ae9780c62"), "name" : "mary", "age" : 26 }
{ "_id" : ObjectId("5678a403763ea69ae9780c63"), "name" : "jackson", "age" : 26 }
{ "_id" : ObjectId("5678a40a763ea69ae9780c64"), "name" : "john", "age" : 29 }
{ "_id" : ObjectId("5678a410763ea69ae9780c65"), "name" : "hxc", "age" : 31 }
{ "_id" : ObjectId("5678a416763ea69ae9780c66"), "name" : "mongodb", "age" : 31 }
{ "_id" : ObjectId("5678a41d763ea69ae9780c67"), "name" : "redis", "age" : 29 }
db.runCommand({
... mapreduce:"person",
... map:function(){
... emit(this.age,this.name)
... },
... reduce:function(key,values){
... return {"key":key,"values":values}
... },
... out:"t"
... })
{
"result" : "t",
"timeMillis" : 20,
"counts" : {
"input" : 6,
"emit" : 6,
"reduce" : 3,
"output" : 3
},
"ok" : 1
}
db.t.find()
{ "_id" : 26, "value" : { "key" : 26, "values" : [ "mary", "jackson" ] } }
{ "_id" : 29, "value" : { "key" : 29, "values" : [ "john", "redis" ] } }
{ "_id" : 31, "value" : { "key" : 31, "values" : [ "hxc", "mongodb" ] } }

把 { "key" : 26, "values" : [ "mary", "jackson" ] } 整体的返回成一个 count就好了 。。。

{ "_id" : 26, "value" : 2 }
{ "_id" : 29, "value" : 2 }
{ "_id" : 31, "value" : 2 }

——————————————————————————————

 db.t.find()
{ "_id" : 26, "value" : { "key" : 26, "values" : [ "mary", "jackson" ] } }
{ "_id" : 29, "value" : { "key" : 29, "values" : [ "john", "redis" ] } }
{ "_id" : 31, "value" : { "key" : 31, "values" : [ "hxc", "mongodb" ] } }
db.runCommand({
... mapreduce:"person",
... map:function(){
... emit(this.age,this.name)
... },
... reduce:function(key,values){
... return values.length;
... },
... out:"t"
... })
{
"result" : "t",
"timeMillis" : 14,
"counts" : {
"input" : 6,
"emit" : 6,
"reduce" : 3,
"output" : 3
},
"ok" : 1
}
db.t.find()
{ "_id" : 26, "value" : 2 } //这个结果就是我们需要的。。。
{ "_id" : 29, "value" : 2 }
{ "_id" : 31, "value" : 2 }

我想把"_id" 替换成 "age", "value" 替换成 “count"

query条件的使用:

> db.t.find()
{ "_id" : 26, "value" : 2 }
{ "_id" : 29, "value" : 2 }
{ "_id" : 31, "value" : 2 }
> db.runCommand({
... mapreduce:"person",
... map:function(){
... emit(this.age,this.name)
... },
... reduce:function(key,values){
... return values.length;
... },
... out:"t",
... finalize:function(key,values){
... return values;
... },
... query:{"$where":function(){return this.age>28}}
... })
{
"result" : "t",
"timeMillis" : 69,
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 2,
"output" : 2
},
"ok" : 1
}
> db.t.find()
{ "_id" : 29, "value" : 2 }
{ "_id" : 31, "value" : 2 }

mongodb--reduce并行处理框架的更多相关文章

  1. Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化

    转自:http://blog.csdn.net/wh_springer/article/details/51842496 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上 ...

  2. Morphia - mongodb之ORM框架

    一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...

  3. day96_11_28 mongoDB与scrapy框架

    一.mongodb mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系型是为了获得更好的扩展性. 它与mysql的区别在于它没有表连接,但是可以通过其他办法实现. 安装数据库. 上官 ...

  4. mongoose-面向对象操作mongodb的Nodejs框架

    介绍 无论是mysql还是mongodb,传统的与数据库交互的方式都是按照他们提供的API来写代码.它们提供的API往往不是很容易理解,而且难以记忆,如果传错了参数,写错一个符号都要查文档. ORM( ...

  5. MongoDB的ORM框架——Morphia

    1.引入pom <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morp ...

  6. Mongodb 的ORM框架 Morphia之注解

    @Entity("bands") public class Band { @Id ObjectId id; String name; String genre; @Referenc ...

  7. Mongodb 的ORM框架 Morphia 注解 之 @Reference

    public class BlogEntry { private String title; private Date publishDate; private String body; privat ...

  8. [转]HIVE UDF/UDAF/UDTF的Map Reduce代码框架模板

    FROM : http://hugh-wangp.iteye.com/blog/1472371 自己写代码时候的利用到的模板   UDF步骤: 1.必须继承org.apache.hadoop.hive ...

  9. mean(bootstrap,angular,express,node,mongodb)通用后台框架

    学习node,我这个毫无美感的程序员在bootstrap与node的感染下,向着“全栈工程师”迈进,呵呵! 最终选择如题的技术方案,这些东东都算比较新的,网上的资料比较少,参考了不少github程序及 ...

随机推荐

  1. 完美解决 linux sublime 中文无法输入

    感谢oschina 中几位前辈的分享 下面是我结合自己的情况所配置的具体步骤: 系统环境: ubuntu 12.10 输入法:fcitx fcitx 安装 apt-get install fcitx ...

  2. Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?

    转自:http://www.webym.net/jiaocheng/473.html 这个问题比较容易解决,如果不希望浏览器保留以前输入的内容,只要给对应的 input 输入框加上以下参数: auto ...

  3. Spark常见编程问题解决办法及优化

    目录 1.数据倾斜 2.TopN 3.Join优化 预排序的join cross join 考虑Join顺序 4.根据HashMap.DF等数据集进行filter 5.Join去掉重复的列 6.展开N ...

  4. selenium3+python-多窗口、句柄(handle)

    一.获取当前窗口句柄 1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别. 2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换.但是脚本没长眼 ...

  5. 延时提示框制作思路[简单javascript案例]

    模拟QQ软件中的弹出提示框功能,制作一个简易的延时提示框. 功能实现: 1.当鼠标移入指定区块时,弹出隐藏的区块:当鼠标移出指定区块时,弹出的隐藏区块再次隐藏. 2.同时要求在鼠标移入该弹出区块后,区 ...

  6. idea常用快捷键(转)

    ---恢复内容开始--- IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+S ...

  7. C# Area 双重路由如何写

    在WebApi项目里面 一般除了接口, 还有管理端...一些乱七八糟的,你想展示的东西, 一种做法是分开写: 比如管理后台一个项目, 然后接口一个, 然后页面一个, 其实这样做也可以,但是这么做, 无 ...

  8. max-age 和 Expires

    网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为private.   Ex ...

  9. js---通过代码学习

    1:本例演示 getElementsByTagName 方法. 2:本例演示 getElementsByTagName 方法 3:注意:

  10. vs2015网站部署到iis后运行调试:无法在web服务器上启动调试的问题,403已禁止

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files C:\Windows\Microsoft.NET\Frame ...