千家信息网

MapReduce怎么在MongoDB中使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章为大家展示了MapReduce怎么在MongoDB中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。string map = @"function(
千家信息网最后更新 2026年10月31日MapReduce怎么在MongoDB中使用

本篇文章为大家展示了MapReduce怎么在MongoDB中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

string map = @"function() {var view = this;emit(view.activity, {pv: 1});}";string reduce = @" function(key, values) {var result = {pv: 0};values.forEach(function(value){ result.pv += value.pv;});return result;}";string finalize = @"function(key, value){return value;}";

mapReduce

MongoDB中的MapReduce可以用来实现更复杂的聚合命令,使用MapReduce主要实现两个函数:map函数和reduce函数,map函数用来生成键值对序列,map函数的结果作为reduce函数的参数,reduce函数中再做进一步的统计,比如我的数据集如下:

{"_id" : ObjectId("59fa71d71fd59c3b2cd908d7"),"name" : "鲁迅","book" : "呐喊","price" : 38.0,"publisher" : "人民文学出版社"}{"_id" : ObjectId("59fa71d71fd59c3b2cd908d8"),"name" : "曹雪芹","book" : "红楼梦","price" : 22.0,"publisher" : "人民文学出版社"}{"_id" : ObjectId("59fa71d71fd59c3b2cd908d9"),"name" : "钱钟书","book" : "宋诗选注","price" : 99.0,"publisher" : "人民文学出版社"}{"_id" : ObjectId("59fa71d71fd59c3b2cd908da"),"name" : "钱钟书","book" : "谈艺录","price" : 66.0,"publisher" : "三联书店"}{"_id" : ObjectId("59fa71d71fd59c3b2cd908db"),"name" : "鲁迅","book" : "彷徨","price" : 55.0,"publisher" : "花城出版社"}

假如我想查询每位作者所出的书的总价,操作如下:

var map=function(){emit(this.name,this.price)}var reduce=function(key,value){return Array.sum(value)}var options={out:"totalPrice"}db.sang_books.mapReduce(map,reduce,options);db.totalPrice.find()

emit函数主要用来实现分组,接收两个参数,第一个参数表示分组的字段,第二个参数表示要统计的数据,reduce来做具体的数据处理操作,接收两个参数,对应emit方法的两个参数,这里使用了Array中的sum函数对price字段进行自加处理,options中定义了将结果输出的集合,届时我们将在这个集合中去查询数据,默认情况下,这个集合即使在数据库重启后也会保留,并且保留集合中的数据。

查询结果如下:

{ "_id" : "曹雪芹", "value" : 22.0}{ "_id" : "钱钟书", "value" : 165.0}{ "_id" : "鲁迅", "value" : 93.0}

再比如我想查询每位作者出了几本书,如下:

var map=function(){emit(this.name,1)}var reduce=function(key,value){return Array.sum(value)}var options={out:"bookNum"}db.sang_books.mapReduce(map,reduce,options);db.bookNum.find()

查询结果如下:

{ "_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表示要操作的集合
mapmap函数
reducereduce函数
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" }}{ "_id" : "鲁迅", "value" : {  "author" : "鲁迅",  "books" : "呐喊,--haha--,彷徨",  "sang" : "haha" }}

上述内容就是MapReduce怎么在MongoDB中使用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

函数 结果 鲁迅 参数 钱钟书 曹雪芹 数据 谈艺录 查询 统计 选注 红楼 红楼梦 处理 两个 出版社 人民 作者 回条 文学 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技 亿人帮互联网科技有限公司 互联网科技网 西安纸贵互联网科技有限公司 金融科技还是互联网 互联网 科技 科技与互联网发展 美国互联网科技 北京禾田雨橡互联网科技 苏州大垚互联网科技 长亮科技互联网金融 卫星互联网科技股票 互联网科技中介 注册互联网科技公司经营范围大全 济南有互联网科技公司吗 广州千川互联网科技有限公司 广州燕处互联网科技有限公司 全球科技与互联网公司市值变化 互联网科技的前景 长沙易易互联网科技有限公司 关于新基建和互联网科技 远拓互联网科技 多迪互联网科技有限公司 常德市电业局互联网科技部 产业互联网科技服务公司 2021世界互联网领先科技成果发布 数字互联网科技有限公司 杭州融税互联网科技有限公司 上海旺乐尼互联网科技有限公司 恒生科技互联网指数十大成分股
0