MongoDB汇总数据以生成“最新活动”

时间:2010-11-19 10:24:58

标签: ruby mongodb reporting mapreduce dashboard

我有一个mongodb集合,其中包含以下文档:

[
  {
  :event => {:type => 'comment_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'}
  }

,
  {
  :event => {:type => 'vote_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'}
  }
]

我需要的是建立一个“仪表板”,汇总每个项目的最新活动(当天)。结果应该是这样的:

{
:item_id => 10,
:events => {
  :vote_created => [.. ordered list with latest 3 vote_created events/documents],
  :comment_created => [.. ordered list with latest 3 comment_created events/documents ],
  }
}

结果将用于构建“Facebook风格”的语法,如:'Mike,John和其他3人今天在您的项目上添加评论。'

如何使用group或map-reduce函数聚合此数据?

2 个答案:

答案 0 :(得分:4)

好的,有两种方法可以做到这一点:

方法#1:Map-Reduce

首先,您需要运行map-reduce,而不是组。

使用Map-Reduce和“out”变量,它将生成一个新的集合。然后,您就可以针对该新集合运行摘要查询。

你这样做的原因是你要求一个昂贵的查询,所以以“不太”的方式实时访问它会更合理。

方法#2:双重写入

您基本上可以维护两个集合“详细信息”(前一个)和“摘要”(下一个)。无论何时写入详细信息,还要对摘要执行更新。

MongoDB有几种数组方法($push, $pull, $slice),可以使“vote_created”数组保持最新状态。

偏好

您选择的方法完全取决于您拥有的架构类型和所需的用户体验。就个人而言,我只会使用方法#2并继续追加“vote_created”数组。我会在视图的某处放置'Mike,John和其他3个......'语法,b / c它真的是视图逻辑而不是DB逻辑。

是的方法#2需要更多空间,但它也可以让您快速回答您提出的问题。所以你将不得不牺牲空间来达到这个速度。

答案 1 :(得分:0)