2011-04-27 167 views
7

实时聚集在探索如何做MongoDB的实时分析,似乎是做算术相当标准的方法,但没有更复杂的聚集方面。有些事情已经帮助...策略MongoDB中

做资金的基本方法是,以原子为进来的每个新的纪录,增量文件的密钥缓存常用查询:

Stats.collection.update({"keys" => ["a", "b", "c"]}, {"$inc" => {"counter_1" => 1, "counter_2" => 1"}, "upsert" => true); 

这不除了总和以外的其他汇总工作。我的问题是,可以这样做的平均值,,和max在mongodb?

说你有一个这样的文件:

{ 
    :date => "04/27/2011", 
    :page_views => 1000, 
    :user_birthdays => ["12/10/1980", "6/22/1971", ...] # 1000 total 
} 

你能做到这一点分组的生日弄成这样一些原子或优化/实时操作?

{ 
    :date => "04/27/2011", 
    :page_views => 1000, 
    :user_birthdays => ["12/10/1980", "6/22/1971", ...], # 1000 total 
    :average_age => 27.8, 
    :age_rank => { 
    "0 to 20" => 180, 
    "20 to 30" => 720, 
    "30 to 40" => 100, 
    "40 to 50" => 0 
    } 
} 

...就像你可以做Doc.collection.update({x => 1}, {"$push" => {"user_birthdays" => "12/10/1980"}})的东西添加到一个数组,而不必加载文档,你可以做这样的事情,以平均/聚合数组?有没有什么东西可以用于实时聚合?

的MapReduce是用来做这在批处理作业,我在寻找模式的东西,如实时的map-reduce为:

  1. 平均值:每次推新项目的时间在MongoDB的数组,什么是实时进行平均的值的最佳方式是什么?
  2. 分组:如果你10岁支架组的年龄,和你有一个年龄数组,你怎么可以优化更新计数对于每个组你与新时代的更新文件?说年龄阵列将不断推/拉。
  3. 最小值/最大值:有一些什么方法来计算和存储文档中年龄阵列的最小/最大?

回答

4

你能做到这一点分组的生日弄成这样一些原子或优化/实时操作?

看起来您已添加两个字段age_rank,average_age。这些都是根据您已拥有的数据有效计算的字段。如果我给你带页面浏览量和用户生日的文件,它应该是在客户端代码中查找最小/最大,平均真是小巫见大巫等

在我看来,你问MongoDB的执行为你服务器端聚合。但是你添加了你不想使用Map/Reduce的限制?

如果我正确理解你的问题,你正在寻找的东西,你可以说“将该产品添加到一个数组中,并有所有相关项目进行自我更新”?你不希望读者执行任何逻辑,你希望一切都在服务器端“神奇地”发生。

因此,有解决这一三种不同的方式,但其中只有一个是当前可用:

  1. 写这个逻辑客户端。这听起来不像你想要的解决方案,但它会起作用。如果你有基础数据,在大多数语言中做max/min/med/avg应该是相当平凡的。
  2. 利用Aggregation的即将发布的功能。这些不在1.9.x之前安排。改进的聚合将允许提取您正在查找的数据,但是,您仍然必须编写适当的查询。底层数据库仍然不包含您正在查找的数据。
  3. 您需要triggers。如果您确实希望数据库始终保持一致并包含汇总数据,那么这就是您所需要的。但是,触发器功能尚不存在。

不幸的是,你现在唯一的选择是#1。幸运的是,我知道一些成功使用选项#1的人。