MongoDB中MapReduce使用

查询结果如下:

{

“_id” : “曹雪芹”,

“value” : 1.0

}

{

“_id” : “钱钟书”,

“value” : 2.0

}

{

“_id” : “鲁迅”,

“value” : 2.0

}

将每位作者的书列出来,如下:

var map=function(){emit(this.name,this.book)}

var reduce=function(key,value){return value.join(‘,’)}

var options={out:“books”}

db.sang_books.mapReduce(map,reduce,options);

db.books.find()

结果如下:

{

“_id” : “曹雪芹”,

“value” : “红楼梦”

}

{

“_id” : “钱钟书”,

“value” : “宋诗选注,谈艺录”

}

{

“_id” : “鲁迅”,

“value” : “呐喊,彷徨”

}

比如查询每个人售价在¥40以上的书:

var map=function(){emit(this.name,this.book)}

var reduce=function(key,value){return value.join(‘,’)}

var options={query:{price:{$gt:40}},out:“books”}

db.sang_books.mapReduce(map,reduce,options);

db.books.find()

query表示对查到的集合再进行筛选。

结果如下:

{

“_id” : “钱钟书”,

“value” : “宋诗选注,谈艺录”

}

{

“_id” : “鲁迅”,

“value” : “彷徨”

}

runCommand实现


我们也可以利用runCommand命令来执行MapReduce。格式如下:

db.runCommand(

{

mapReduce: ,

map: ,

reduce: ,

finalize: ,

out: ,

query: ,

sort: ,

limit: ,

scope: ,

jsMode: ,

verbose: ,

bypassDocumentValidation: ,

collation:

}

)

含义如下:

| 参数 | 含义 |

| :-- | :-- |

| mapReduce | 表示要操作的集合 |

| map | map函数 |

| reduce | reduce函数 |

| finalize | 最终处理函数 |

| out | 输出的集合 |

| query | 对结果进行过滤 |

| sort | 对结果排序 |

| limit | 返回的结果数 |

| scope | 设置参数值,在这里设置的值在map、reduce、finalize函数中可见 |

| jsMode | 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false |

| verbose | 是否显示详细的时间统计信息 |

| bypassDocumentValidation | 是否绕过文档验证 |

| collation | 其他一些校对 |

如下操作,表示执行MapReduce操作并对统计的集合限制返回条数,限制返回条数之后再进行统计操作,如下:

var map=function(){emit(this.name,this.book)}

var reduce=function(key,value){return value.join(‘,’)}

db.runCommand({mapreduce:‘sang_books’,map,reduce,out:“books”,limit:4,verbose:true})

db.books.find()

执行结果如下:

{

“_id” : “曹雪芹”,

“value” : “红楼梦”

}

{

“_id” : “钱钟书”,

“value” : “宋诗选注,谈艺录”

}

{

“_id” : “鲁迅”,

“value” : “呐喊”

}

小伙伴们看到,鲁迅有一本书不见了,就是因为limit是先限制集合返回条数,然后再执行统计操作。

finalize操作表示最终处理函数,如下:

var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue; return obj}

var map=function(){emit(this.name,this.book)}

var reduce=function(key,value){return value.join(‘,’)}

db.runCommand({mapreduce:‘sang_books’,map,reduce,out:“books”,finalize:f1})

db.books.find()

f1第一个参数key表示emit中的第一个参数,第二个参数表示reduce的执行结果,我们可以在f1中对这个结果进行再处理,结果如下:

{

“_id” : “曹雪芹”,

“value” : {

“author” : “曹雪芹”,

“books” : “红楼梦”

}

}

{

“_id” : “钱钟书”,

“value” : {

“author” : “钱钟书”,

“books” : “宋诗选注,谈艺录”

}

}

{

“_id” : “鲁迅”,

“value” : {

“author” : “鲁迅”,

“books” : “呐喊,彷徨”

}

}

scope则可以用来定义一个在map、reduce和finalize中都可见的变量,如下:

var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue;obj.sang=sang; return obj}

var map=function(){emit(this.name,this.book)}

var reduce=function(key,value){return value.join(‘,–’+sang+‘–,’)}

db.runCommand({mapreduce:‘sang_books’,map,reduce,out:“books”,finalize:f1,scope:{sang:“haha”}})

db.books.find()

执行结果如下:

{

“_id” : “曹雪芹”,

“value” : {

“author” : “曹雪芹”,

“books” : “红楼梦”,

“sang” : “haha”

}

}

{

“_id” : “钱钟书”,

“value” : {

“author” : “钱钟书”,

“books” : “宋诗选注,–haha–,谈艺录”,

“sang” : “haha”

}

}

{

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png

{

“_id” : “曹雪芹”,

“value” : {

“author” : “曹雪芹”,

“books” : “红楼梦”,

“sang” : “haha”

}

}

{

“_id” : “钱钟书”,

“value” : {

“author” : “钱钟书”,

“books” : “宋诗选注,–haha–,谈艺录”,

“sang” : “haha”

}

}

{

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
[外链图片转存中…(img-9uYqLKDX-1718710471518)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值