ruby-on-rails – MongoDB中实时聚合的策略
在探索使用MongoDB进行实时分析的方法时,似乎有一种相当标准的方法来进行求和,但在更复杂的聚合方面却没有.一些有帮助的事情……
> Twitter’s Rainbird:实时求和,按层次递增键上的计数器.卡桑德拉. 执行求和的基本方法是以原子方式递增每个新记录的文档键,以缓存常见查询: Stats.collection.update({"keys" => ["a","b","c"]},{"$inc" => {"counter_1" => 1,"counter_2" => 1"},"upsert" => true); 但这不适用于除sum之外的聚合.我的问题是,对于mongodb中的平均值,分钟数和最大值,可以这样做吗? 假设您有这样的文档: { :date => "04/27/2011",:page_views => 1000,:user_birthdays => ["12/10/1980","6/22/1971",...] # 1000 total } 你能做一些原型或优化/实时操作,将生日分组成这样的东西吗? { :date => "04/27/2011",...],# 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中的数组时,实时平均这些值的最佳方法是什么? 解决方法
看起来你已经添加了两个字段age_rank,average_age.这些是基于您已有数据的有效计算字段.如果我向您提供了包含页面浏览量和用户生日的文档,那么客户端代码找到最小值/最大值,平均值等应该是非常简单的. 在我看来,你要求MongoDB为你的服务器端执行聚合.但是你添加了你不想使用Map / Reduce的限制吗? 如果我正确理解你的问题,那么你正在寻找一些可以说“将这个项目添加到数组并让所有相关项目自行更新”的内容?您不希望读者执行任何逻辑,您希望一切都在服务器端“神奇地”发生. 因此,有三种不同的方法可以解决这个问题,但目前只有其中一种可用: >写这个逻辑客户端.它听起来不像你想要的解决方案,但它会起作用.如果您有基础数据,那么在大多数语言中执行max / min / med / avg应该是非常简单的. 不幸的是,你现在唯一的选择是#1.幸运的是,我知道有几个人成功使用选项#1. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |