[英]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.