我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MapReduce怎么在MongoDB中使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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: <collection>,
     map: <function>,
     reduce: <function>,
     finalize: <function>,
     out: <output>,
     query: <document>,
     sort: <document>,
     limit: <number>,
     scope: <document>,
     jsMode: <boolean>,
     verbose: <boolean>,
     bypassDocumentValidation: <boolean>,
     collation: <document>
    }
    )

含义如下:

参数含义
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中使用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MapReduce怎么在MongoDB中使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Hadoop中怎么使用MapReduce

在Hadoop中使用MapReduce,一般会按照以下步骤进行:实现Map函数和Reduce函数:首先需要编写Map函数和Reduce函数,Map函数用于将输入数据分割成key/value对,Reduce函数用于对Map函数输出的结果进行汇
Hadoop中怎么使用MapReduce
2024-03-14

怎么使用MapReduce

这篇文章给大家分享的是有关怎么使用MapReduce的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。大数据是使用工具和技术处理大量和复杂数据集合的术语。能够处理大量数据的技术称为MapReduce。何时使用MapR
2023-06-02

Hadoop MapReduce怎么使用

本篇内容介绍了“Hadoop MapReduce怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Apache Hadoop : 是 A
2023-06-19

balancer怎么在MongoDB中使用

本篇文章为大家展示了balancer怎么在MongoDB中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。01 balancer简介 从MongoDB3.4开始,balancer运行在conf
2023-06-14

怎么在Navicat中使用Premium连接mongodb

怎么在Navicat中使用Premium连接mongodb?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0 环境操作系统:win101 准备navicat15 破解CentOS
2023-06-07

怎么在java中使用mongodb实现多表联查

这期内容当中小编将会给大家带来有关怎么在java中使用mongodb实现多表联查,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。多表联查的查询语句:此处使用的为mongodb的robo3t可视化工具,先说下
2023-06-14

怎么在NestJs中使用Mongoose对MongoDB进行操作

这篇文章主要介绍了怎么在NestJs中使用Mongoose对MongoDB进行操作,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!首先是安装所需依赖npm install --save @nestjs/m
2023-06-06

怎么在MongoDB中使用delete()方法删除文档

怎么在MongoDB中使用delete()方法删除文档?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、delete()方法官方推荐使用deleteOne()和delete
2023-06-14

怎么在MongoDB中使用update()方法更新文档

怎么在MongoDB中使用update()方法更新文档?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、update()命令db.collection.update( cr
2023-06-14

MongoDB中dayofmonth函数怎么使用

在MongoDB中,dayofmonth函数用于提取日期字段中的日份。它的语法如下:```{ $dayOfMonth: }```其中,`dateExpression`是一个日期字段或日期表达式。以下是一个示例,演示如何使用dayofmon
2023-09-06

编程热搜

目录