MongoDB中的MapReduce测试用例 mongodb
在MongoDB的聚合框架中,还可以使用MapReduce,它非常强大和灵活,但具有一定的复杂性,专门用于实现一些复杂的聚合功能。
采用Jst来作为查询语言,因此能表达任意的逻辑,但是它运行非常慢,不应该用在实时的数据分析中
MapReduce的HelloWorld
实现的功能,找出集合中所有的键,并统计每个键出现的次数。
1:Map函数使用emit函数来返回要处理的值,示例如下: 参数对应关系如下面的颜色匹配情况
var map = function(){
for(var key in this){ this表示对当前文档的引用。
emit(key,{count:1}); emit 函数是固定的, 按照 key分组计数
}
}
2:reduce函数需要处理Map阶段或者是前一个reduce的数据,因此reduce返回的文档必须要能作为reduce的第二个参数的一个元素,示例如下:
var reduce = function(key,emits){
var total = 0;
for(var i in emits){
total += emits[i].count;
}
return {"count":total};
};
3:运行MapReduce,示例如下:
var mr = db.runCommand({"mapreduce":"scores","map":map,"reduce":reduce,"out":"myout"});
4:查询最终的结果,示例如下:
db.mrout.find();
如统计userId中值,以及每个值出现的次数,就可以如下操作
1:修改map函数,示例如下:
var map = function(){
emit(this.userId,{count:1}); 文档的属性 可用直接采用 this调用
};
2:reduce函数不用改
3:重新执行
db.runCommand({"mapreduce":"scores","map":map,"reduce":reduce,"out":"myout"});
4:查看最终结果:
db.mrout.find();
更多MapReduce可选的键
1:finalize:function :可以将reduce的结果发送到finalize,这是整个处理的最后一步
2:keeptemp:boolean :是否在连接关闭的时候,保存临时结果集合
3:query:document :在发送给map前对文档进行过滤
4:sort:document :在发送给map前对文档进行排序
5:limit:integer :发往map函数的文档数量上限
6:scope:document :可以在javascript中使用的变量
7:verbose:boolean :是否记录详细的服务器日志
示例:
var query = {"userId":{"$gt":"u2"}}
var sort = {"userId":1};
var finalize = function(key,value){
return {"mykey":key,"myV":value};
};
var mr = db.runCommand({"mapreduce":"users","map":map,"reduce":reduce,"out":"mrout","query":query,"sort":sort,"limit":2,"finalize":finalize});
如有疑问 请留言 欢迎提供建议
评论已有 0 条