MongoDB 学习笔记五 MapReduce

runCommand语法:


db.runCommand({  
    mapreduce:<collection>,  
    map:<mapfunction>,  
    reduce:<reducefunction>,  
    [,query:<query filter object>]  
    [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]  
    [,limit:<number of objects to return from collection>]  
    [,out:<see output options below>]  
    [,keeptemp:<true|false>]  
    [,finalize:<finalizefunction>]  
    [,scope:<object where fields go into javascript global scope>]  
    [,verbose:true]  
});  

也可以这样写

db.collectionname.mapReduce(mapfunction,reducefunction,{mout:outcollection});

说明:

  • Mapreduce:要操作的目标集合
  • Map:映射函数(生成键值对序列,作为reduce函数参数)
  • Reduce:统计函数
  • Query:目标记录过滤
  • Sort:目标记录排序
  • Limit:限制目标记录数量
  • Out:统计结果存放集合(不指定使用临时集合,在客户端断开后自动删除)
  • Keeptemp:是否保留临时集合
  • Finalize:最终处理函数(对reduce返回结果进行最终整理后存入结果集合)
  • Scope:向map、reduce、finalize导入外部变量
  • Verbose:显示详细的时间统计信息。

处理顺序

  1. 查询指定Collection
  2. 调用 map 对结果集进行mapper处理
  3. 执行finalize方法处理
  4. 最终结果集输出到临时Collection中
  5. 断开连接,临时Collection删除或保留。

map 文档输入

function(){emit(分组条件key,需要统计的对象value);}
分组条件key会对应最终结果集里的_id主键。

reduce 统计函数

典型的reduce函数:

function(key,values){
    //key对应map里的key,values是同一个key对应的map里 value的数组。
    //可以这样遍历values values.forEach(function(){});
    var ret={age:key,names:values};
    return ret;
}

finalize 最终处理

function(key,rval){
    if(key==0){
        rval.msg="a new life,baby!";
    }
    return rval
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MongoDB的聚合函数mapreduce是一种用于处理大规模数据的方法,它可以将数据集合分成多个小块进行处理,并将结果合并起来生成最终的输出。mapreduce包含两个部分:map和reduce。 map函数是对数据集合进行初步处理的函数,它接收一个文档作为输入,并对文档中的数据进行处理,生成一个键值对作为输出。reduce函数则是对map函数生成的键值对进行处理的函数,它接收一个键和一组相关的值作为输入,并对这些值进行处理,生成一个新的键值对作为输出。 在MongoDB中,mapreduce函数可以通过db.collection.mapReduce()方法进行调用。该方法接收四个参数:map函数、reduce函数、输出集合的名称和一个可选的参数对象。其中,参数对象可以包含过滤条件、排序规则、限制条件等。 下面是一个简单的示例,假设我们有一个名为orders的集合,其中包含以下文档: ``` { "_id" : ObjectId("5f274c4d6d68650a3015a1c1"), "customer" : "Alice", "total" : 10 } { "_id" : ObjectId("5f274c4d6d68650a3015a1c2"), "customer" : "Bob", "total" : 20 } { "_id" : ObjectId("5f274c4d6d68650a3015a1c3"), "customer" : "Charlie", "total" : 30 } ``` 我们可以通过以下代码使用mapreduce函数对数据进行处理: ``` db.orders.mapReduce( function() { emit(this.customer, this.total); }, function(key, values) { return Array.sum(values); }, { out: "order_totals" } ) ``` 这个代码会根据每个文档的customer字段将数据分组,并将每个文档的total字段作为值。map函数生成的键值对会传递给reduce函数进行处理,最终将生成一个名为order_totals的输出集合,其中包含以下文档: ``` { "_id" : "Alice", "value" : 10 } { "_id" : "Bob", "value" : 20 } { "_id" : "Charlie", "value" : 30 } ``` 这个例子只是mapreduce函数的一个简单示例,实际上它的应用非常广泛,可以处理大规模数据、生成复杂的报表等。但是,在使用mapreduce函数时需要注意一些性能问题,例如map函数的执行时间、reduce函数的复杂度等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值