Mongodb的MapReduce学习经验

Mongodb的MapReduce学习经验

Mongodb的Map/reduce在批量操作数据或者聚合操作时很有用。这是官网的英文文档,可以看看:

http://www.mongodb.org/display/DOCS/MapReduce

现在,我该怎么用呢?

现在需要查看最近访问某人页面的5个人列表且不能重复,
访问轨迹在一个visit的collection里存储,visit里有3个字段,u,f,t.分别代表被访者id,访问者id,和访问时间。
现在如果用普通查询,sort可以解决,但是不能重复不能解决,本以为可以用distinct,但在mongodb里,distinct是用

runCommand方式查询的,不是find。。。


既然有Map/reduce,那就用这个试试吧。。。

Map/reduce有2个函数,map和reduce。

map的定义
function map(void) -> void
表示无参数也不返回参数,且必须至少调用emit(key,value)一次。map函数对于这个this Object自己,我们可以在函数体内

用this引用这个object

reduce定义
function reduce(key, value_array) -> value
传入一个key,和一个值数组,返回一个值。

Map/reduce如何运行的呢?我的经验是对于每个数据库里的对象调用map函数,再根据map里指定的key,再一起reduce,由于

一个key对应多个value,因此reduce的参数是value数组,处理完毕,返回这个key对应的最后结果。


在命令行下的可以这么写:


m=function(){
emit(this.f,this);
};
v=function(key,values){
var i=0,idx=-1;
var maxt =0;
for(i=0;i<values.length;i++){
if(maxt< values[i].t){maxt = values[i].t;idx = i;}
}
return values[idx];
};
res = db.userVisit.mapReduce(m,v,{query:{"u":"4c7cd410ea701e4b7bb16c33"}}, {sort:{t:-1}});
db[res.result].find();//此处返回{key:"",value:""}对应每个f及visit对象
res.drop();//因为会创建个临时表,在这里显示的删除它,虽然在连接关闭时会自动删除



java代码可以这么写:


DBObject q = new BasicDBObject();
q.put("u", userId);

final String m = "function(){emit(this.f,this);};";
final String r = "function(key,values){"+
"var i=0;" +
"var idx=-1;"+
"var maxt=0;"+
"for(i=0;i<values.length;i++){"+//同ket,选择最大的时间
" if(maxt< values[i].t){maxt = values[i].t;idx = i;}"+
"}"+
"return values[idx];"+
"};";


MapReduceOutput out = super.dbCol.mapReduce(m, r, null, q);
DBCursor cur = out.results();
cur.limit(num);
List<Visit> list = new ArrayList<Visit>(num);
DBObject obj = null;
try{
while (cur.hasNext()) {
obj = cur.next();
list.add(super.dbobjectToObject((DBObject) obj.get("value")));
}
}catch(Exception e){
e.printStackTrace();
}
out.drop();
return list;


这是我学习的经验,欢迎提出批评指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值