2

我有一个 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 函数聚合这些数据?

4

2 回答 2

4

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

方法 #1:Map-Reduce

所以首先,你需要运行一个 map-reduce,而不是一个组。

将 Map-Reduce 与将生成新集合的“out”变量一起使用。然后,您将能够针对该新集合运行摘要查询。

您这样做的原因是您要求进行昂贵的查询,因此以“不完全”的实时访问它更为合理。

方法#2:双写

您基本上可以维护两个集合“详细信息”(顶部一个)和“摘要”(底部一个)。每当您写入详细信息时,也要对摘要执行更新。

MongoDB 有几种数组方法($push、$pull、$slice),它们应该可以使“vote_created”数组保持最新。

喜好

您选择的方法完全取决于您拥有的架构类型和您想要的用户体验。就个人而言,我只会使用方法 #2 并继续附加到“vote_created”数组。我会将“Mike、John 和其他 3 个......”语法放在视图的某个位置,b/c 它实际上是视图逻辑而不是数据库逻辑。

是的,方法 #2 占用更多空间,但它也可以让您快速回答您经常提出的问题。所以你将不得不牺牲空间来获得那个速度。

于 2010-11-19T17:25:49.967 回答
0

http://rickosborne.org/download/SQL-to-MongoDB.pdf

于 2010-11-19T11:01:11.817 回答