在探索使用MongoDB进行实时分析的方法时,似乎有一种相当标准的方法来进行求和,但在更复杂的聚合方面却没有.一些有帮助的事情......
Twitter的Rainbird:实时总和,按层次递增密钥上的计数器.卡桑德拉.
雅虎的S4和来源:还不确定它是如何工作的,但它看起来像是实时的map-reduce.所以基本上,对于添加的每个记录,您将其传递给映射器,它将其转换为哈希值,并将其发送到报表文档中.
http://www.slideshare.net/dacort/mongodb-realtime-data-collection-and-stats-generation
蜂鸟
执行求和的基本方法是以原子方式递增每个新记录的文档键,以缓存常见查询:
Stats.collection.update({"keys" => ["a", "b", "c"]}, {"$inc" => {"counter_1" => 1, "counter_2" => 1"}, "upsert" => true);
但这不适用于总和以外的聚合.我的问题是,对于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年括号,并且您有年龄数组,那么当您使用新年龄更新文档时,如何以最佳方式更新每个组的计数?说年龄阵列将不断推/拉.
最小/最大:在该文档中计算和存储该年龄数组的最小值/最大值的一些方法是什么?
Gates VP.. 5
你能做一些原型或优化/实时操作,将生日分组成这样的东西吗?
看起来你已经添加了两个领域age_rank
,average_age
.这些是基于您已有数据的有效计算字段.如果我给你带有页面浏览量和用户生日的文档,那么客户端代码找到最小值/最大值,平均值等应该是非常简单的.
在我看来,你要求MongoDB为你的服务器端执行聚合.但是你添加了你不想使用Map/Reduce的限制吗?
如果我正确理解你的问题,那么你正在寻找一些可以说"将这个项目添加到一个数组并让所有依赖项目自行更新"的东西?你不希望读者执行任何逻辑,你希望一切都在服务器端"神奇地"发生.
因此,有三种不同的方法可以解决这个问题,但目前只有其中一种可用:
写这个逻辑客户端.它听起来不像你想要的解决方案,但它会起作用.如果您有基础数据,那么在大多数语言中执行max/min/med/avg应该是非常简单的.
利用即将推出的聚合功能.这些不会安排到1.9.x. 改进的聚合将允许提取您正在寻找的数据,但是,您仍然必须编写适当的查询.底层数据库仍然不包含您正在寻找的数据.
你需要触发器.如果您确实希望数据库始终保持一致并包含汇总数据,那么这就是您所需要的.但是,触发器功能尚不存在.
不幸的是,你现在唯一的选择是#1.幸运的是,我知道有几个人成功使用选项#1.
你能做一些原型或优化/实时操作,将生日分组成这样的东西吗?
看起来你已经添加了两个领域age_rank
,average_age
.这些是基于您已有数据的有效计算字段.如果我给你带有页面浏览量和用户生日的文档,那么客户端代码找到最小值/最大值,平均值等应该是非常简单的.
在我看来,你要求MongoDB为你的服务器端执行聚合.但是你添加了你不想使用Map/Reduce的限制吗?
如果我正确理解你的问题,那么你正在寻找一些可以说"将这个项目添加到一个数组并让所有依赖项目自行更新"的东西?你不希望读者执行任何逻辑,你希望一切都在服务器端"神奇地"发生.
因此,有三种不同的方法可以解决这个问题,但目前只有其中一种可用:
写这个逻辑客户端.它听起来不像你想要的解决方案,但它会起作用.如果您有基础数据,那么在大多数语言中执行max/min/med/avg应该是非常简单的.
利用即将推出的聚合功能.这些不会安排到1.9.x. 改进的聚合将允许提取您正在寻找的数据,但是,您仍然必须编写适当的查询.底层数据库仍然不包含您正在寻找的数据.
你需要触发器.如果您确实希望数据库始终保持一致并包含汇总数据,那么这就是您所需要的.但是,触发器功能尚不存在.
不幸的是,你现在唯一的选择是#1.幸运的是,我知道有几个人成功使用选项#1.