gpt4 book ai didi

ruby-on-rails - MongoDB 中的实时聚合策略

转载 作者:IT老高 更新时间:2023-10-28 13:22:17 26 4
gpt4 key购买 nike

在探索使用 MongoDB 进行实时分析的方法时,似乎有一种相当标准的求和方法,但在更复杂的聚合方面却没有。一些有帮助的事情...

求和的基本方法是为每条新记录自动增加文档键,以缓存常见查询:

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

这不适用于总和以外的聚合。我的问题是,mongodb 中的 averagesminma​​x 可以这样做吗?

假设你有一个这样的文件:

{
: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. Averages:每次将新项目推送到 MongoDB 中的数组时,实时平均这些值的最佳方法是什么?
  2. 分组:如果您将年龄分组为 10 年括号,并且您有一个年龄数组,那么当您使用新年龄更新文档时,如何以最佳方式更新每个组的计数?假设年龄数组将不断被推/拉。
  3. Min/Max:有哪些方法可以计算和存储该文档中年龄数组的最小值/最大值?

最佳答案

Could you do some atomic or optimized/real-time operation that grouped the birthdays into something like this?

您似乎添加了两个字段age_rankaverage_age。这些是根据您已有的数据有效计算的字段。如果我给了你包含页面浏览量和用户生日的文档,客户端代码应该很容易找到最小值/最大值、平均值等。

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

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

所以有三种不同的方法来解决这个问题,但目前只有一种可用:

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

很遗憾,您现在唯一的选择是 #1。幸运的是,我知道有几个人成功地使用了选项 #1。

关于ruby-on-rails - MongoDB 中的实时聚合策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com