【问题标题】:MongoDB aggregate data to generate 'latest activity'MongoDB 聚合数据以生成“最新活动”
【发布时间】:2010-11-19 10:24:57
【问题描述】:

我有一个 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 人今天在您的项目上添加了 cmets。”

如何使用组或 map-reduce 函数聚合这些数据?

【问题讨论】:

    标签: ruby mongodb reporting mapreduce dashboard


    【解决方案1】:

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

    方法#1:Map-Reduce

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

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

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

    方法#2:双写

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

    MongoDB 有几个数组方法 ($push, $pull, $slice),应该可以让“vote_created”数组保持最新。

    首选项

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

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

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2017-02-18
      • 2020-06-06
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多