`
wjjxf
  • 浏览: 237619 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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;


这是我学习的经验,欢迎提出批评指正。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics