策略MongoDB中
问题描述:
实时聚集在探索如何做MongoDB的实时分析,似乎是做算术相当标准的方法,但没有更复杂的聚集方面。有些事情已经帮助...策略MongoDB中
- Twitter's Rainbird:实时总和,递增键上的计数器分层次。卡桑德拉。
- Yahoo's S4和source:不知道到底是如何工作的呢,但看起来它是实时的map-reduce。所以基本上,为每一个加入真实的记录,你把它传递给一个映射器,它把它转换成一个散列,并且将其发送到集成到报告文件。
- http://www.slideshare.net/dacort/mongodb-realtime-data-collection-and-stats-generation
- Hummingbird
做资金的基本方法是,以原子为进来的每个新的纪录,增量文件的密钥缓存常用查询:
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为:
- 平均值:每次推新项目的时间在MongoDB的数组,什么是实时进行平均的值的最佳方式是什么?
- 分组:如果你10岁支架组的年龄,和你有一个年龄数组,你怎么可以优化更新计数对于每个组你与新时代的更新文件?说年龄阵列将不断推/拉。
- 最小值/最大值:有一些什么方法来计算和存储文档中年龄阵列的最小/最大?
答
你能做到这一点分组的生日弄成这样一些原子或优化/实时操作?
看起来您已添加两个字段age_rank
,average_age
。这些都是根据您已拥有的数据有效计算的字段。如果我给你带页面浏览量和用户生日的文件,它应该是在客户端代码中查找最小/最大,平均真是小巫见大巫等
在我看来,你问MongoDB的执行为你服务器端聚合。但是你添加了你不想使用Map/Reduce的限制?
如果我正确理解你的问题,你正在寻找的东西,你可以说“将该产品添加到一个数组中,并有所有相关项目进行自我更新”?你不希望读者执行任何逻辑,你希望一切都在服务器端“神奇地”发生。
因此,有解决这一三种不同的方式,但其中只有一个是当前可用:
- 写这个逻辑客户端。这听起来不像你想要的解决方案,但它会起作用。如果你有基础数据,在大多数语言中做max/min/med/avg应该是相当平凡的。
- 利用Aggregation的即将发布的功能。这些不在1.9.x之前安排。改进的聚合将允许提取您正在查找的数据,但是,您仍然必须编写适当的查询。底层数据库仍然不包含您正在查找的数据。
- 您需要triggers。如果您确实希望数据库始终保持一致并包含汇总数据,那么这就是您所需要的。但是,触发器功能尚不存在。
不幸的是,你现在唯一的选择是#1。幸运的是,我知道一些成功使用选项#1的人。