mongodb mapreduce, 实现 select sum(a*b) from test

查看:105
本文介绍了mongodb mapreduce, 实现 select sum(a*b) from test的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

首先介绍user collection

user {'username':, 'age':, 'account':}

下面是正常的group_by 和count实现

//SQL实现

select username,count(sku) from user group by username

//MapReduce实现

map=function (){
    emit(this.username,{count:1})
}

reduce=function (key,values){
    var cnt=0;   
    values.forEach(function(val){ cnt+=val.count;});  
    return {"count":cnt}
}

//执行mapreduce

db.test.mapReduce(map,reduce,{out:"mr1"})

db.mr1.find()

{ "_id" : "Joe", "value" : { "count" : 416 } }
{ "_id" : "Josh", "value" : { "count" : 287 } }
{ "_id" : "Ken", "value" : { "count" : 297 } }

然后

//SQL实现

select sum(age * account) from user

//MapReduce实现,或者用其他方法实现也可以
???????????????????

解决方案

通常我们会建议避免在MongoDB中使用map/reduce,性能表现并不十分理想。大部分时候可以使用aggregation framework取代,特别是只涉及一个表的时候。

db.user.aggregate([
  {$group: {_id: '$username', count: {$sum: 1}}}
]);

具体语法就请自己查阅aggregation的语法咯。a*b会比较复杂一点,你实际需要的是每条记录的a*b的值(pipline1),然后求和(pipline2):

db.user.aggregate([
  {$group: {_id: "$username", temp_result: {$multiply: ["$age", "$account"]}}},
  {$group: {_id: null, result: {$sum: "$temp_result"}}}
]);

这篇关于mongodb mapreduce, 实现 select sum(a*b) from test的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆