mongo聚合计算不同文档之间时间戳的差异

时间:2016-03-11 02:44:12

标签: ruby mongodb mapreduce

---- ----更新

我知道有一些帖子已经解释了如何在Mongo聚合中使用$subtract,但我仍然对如何解决这个问题感到困惑。

以下是一些示例文档,文档记录了用户行为的行为,

用户001输入index.html 1457578406751,并将index.html保留为1457578433076,因此通过减去log1和log2的时间戳,我可以知道用户001在index.html上停留多长时间。

用户操作定义为:userA输入a.html ---(t1) - 离开a.html ----输入b.html - (t2) - 离开b.html ----输入a.html - (t3) - 离开a.html .......,在一系列动作之后,userA关闭浏览器。 我需要做的是:计算t1,t2,t3

每次用户进行操作时,系统都会输出一个日志,如示例所示,因此对于一个用户,可能会有很多日志,对于多个用户来说甚至更多。

我的问题: 如何根据uid和别名计算时间间隔?

我的想法是:首先在所有日志中找到所有唯一的uid,然后对于那些唯一的uid中的不同别名获取时间戳并将它们放入数组中,进行减法。我写了一些伪代码,不确定它是否正确

for uid in log{    
  for alias in uid{
      arr =  Array.new  
      diff = Array.new  //diff.length = arr.length/2
      put timestamp to arr  //list of timestamp for a uid
        for i in diff.length
           diff[i] = arr[2*i]- arr[2*i-1]
   }  
}

我可以简单地使用Mongo聚合或Mongo map-reduce吗?真的需要一些想法,希望有人可以帮助我。顺便说一下,我使用红宝石。感谢

log1: {"_id"=>BSON::ObjectId('56e13073b3afca038b8b4567'), 
"action"=>"PageEnter", 
"timestamp"=>"1457578406751", 
"alias"=>"index.html", 
"uid"=>"001"}


log2: {"_id"=>BSON::ObjectId('56e13073b3afca038b8b4568'), 
 "action"=>"PageQuit",
 "timestamp"=>"1457578433076", 
"alias"=>"index.html", 
"uid"=>"001"}

log3:{"_id"=>BSON::ObjectId('xxxxxxx'), 
 "action"=>"PageEnter",
 "timestamp"=>"1557578433076", 
"alias"=>"contact.html", 
"uid"=>"002"}

log4:{"_id"=>BSON::ObjectId('xxxxxxx'), 
 "action"=>"PageQuit",
 "timestamp"=>"1557578433086", 
"alias"=>"contact.html", 
"uid"=>"002"}
 .
 .
 .
logn:{}

0 个答案:

没有答案