注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

Mongodb实战:MapReduce计算更新频率  

2012-03-27 11:20:01|  分类: node |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
公司最近推了个sns小项目,打算用mongodb作为主要的数据存储,功能类似新浪微博,有订阅,关注什么的一些服务器推技术。整个mongodb数据库设计倒是很快,为每一个用户增加一个固定长度的关注和订阅池,当有新内容或新元素时就推到这个池子里,反正池子是根据录入时间排序的,所以也不用排序,很简单,具体mongodb数据库设计文档就不拿上来献丑了。

但是产品有一个这样的需求,就是一个话题的最近7天更新频率,也就是说必须要有一个异步的脚本每天凌晨去跑一下,把计算的结果插入到话题这个集合中去。一开始打算用shell写,后来又觉得麻烦,想用php写,又怕php脚本时间执行超时,最后还是决定使用mongodb自带的mapreduce去做这个事情,最后实现出来发现真的超简单。

1、我们先向测试集合插入1000条数据:
for(var i=0;i<1000;i++){
var x = Math.floor(Math.random()*10)
db.element.insert({id:"element_"+i, name:"频道名字"+i, channelid:'channel_'+x, createtime:Date.parse(new Date("2012-2-2"))})
}
这样就插入了1000条创建时间为2012-2-2,并且channelid随机为0-9的文档。

2、我们再向集合插入2000条最新数据
for(var i=2000;i<4000;i++){
var x = Math.floor(Math.random()*10)
db.element.insert({id:"element_"+i, name:"频道名字"+i, channelid:'channel_'+x, createtime:Date.parse(new Date())})
}
这样就插入了2000条创建时间是当前,并且channelid随机为0-9的文档。

3、执行mapReduce函数
db.runCommand({
mapreduce:"element",
map:function(){
emit(this.channelid, {count:1});
},
reduce:function(key,emits){
var total=0;
for(var j=0, n=emits.length;j<n;j++){
total += emits[j].count;
}
return {count:total};
},
out:"channelpush",
query:{createtime:{$gt:Date.parse(new Date())-1000*60*60*24*7}},
scope:{isnow:new Date()}
});
我们根据query这个属性筛选出了最近7天的记录,然后对channelid做统计

4、看下结果吧
db.channelpush.find()

{ "_id" : "channel_0", "value" : { "count" : 179 } }
{ "_id" : "channel_1", "value" : { "count" : 194 } }
{ "_id" : "channel_2", "value" : { "count" : 213 } }
{ "_id" : "channel_3", "value" : { "count" : 226 } }
{ "_id" : "channel_4", "value" : { "count" : 179 } }
{ "_id" : "channel_5", "value" : { "count" : 204 } }
{ "_id" : "channel_6", "value" : { "count" : 203 } }
{ "_id" : "channel_7", "value" : { "count" : 230 } }
{ "_id" : "channel_8", "value" : { "count" : 189 } }
{ "_id" : "channel_9", "value" : { "count" : 183 } }

最近7天的更新频率就出来拉,如果在 channelpush 集合中没有找到的channelid 我们则认为推送频率为0了
是不是很简单,相信一些用户关系挖掘,数据统计等利用mapreduce可以省不少力呀~
  评论这张
 
阅读(1263)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016