繁体   English   中英

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

[英]MongoDB aggregate data to generate 'latest activity'

我有一个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个人今天在您的商品上添加了评论”。

如何使用组或map-reduce函数汇总此数据?

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

方法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占用了更多空间,但是它也可以为您快速解答很多问题。 因此,您将不得不牺牲空间来获得该速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM