0

我正在构建一个可以与 Android 应用程序一起使用的 MongoDB 数据库。我有一个用户集合和一个记录集合。记录文件包括 GPS 轨迹,例如开始和结束坐标、总时间以及最高速度和距离。用户文档具有用户 ID、名字、姓氏等。

我想为每个用户汇总总距离、总时间、总平均速度和迄今为止的最高速度。

如果我应该做一个 map reduce 并为用户创建一个聚合集合,或者我是否应该使用某种 cron 作业类型 soliuton 将这些统计信息添加到用户文档中,我感到很困惑。我已经阅读了许多关于 MongoDB 的 map reduce 和聚合的指南,但无法弄清楚这一点。

谢谢!

4

1 回答 1

0

听起来您的聚合指标值是每个用户的,在这种情况下,我只需计算它们并将它们直接推送到用户对象中,同时更新当前坐标、速度等。它们会很好也很容易(并且快速)进行查询,如果您愿意,您可以进一步聚合它们。

当我说预计算时,我不是指 MapReduce,您可以将其用作批处理,我只是指在更新用户对象时进行计算。

如果您的聚合统计信息是用户编译的,那么您仍然可以在更新时预先计算它们,但是如果您还需要能够根据其他条件或过滤器查询这些聚合统计信息,例如,“告诉我总距离是多少为 x 区域内的所有用户旅行”,那么根据组合的数量,您可能无法通过预先计算覆盖所有用户。

因此,如果您的汇总统计信息是跨用户的,并且需要应用某种过滤器,那么它们将需要从一些数据快照中计算出来。这里的两种方法是;

  1. 2.2 中的聚合框架
  2. MapReduce

你需要使用 MapReduce 说,如果你有很多历史数据要处理,你可以预先计算结果以便以后快速阅读。根据我的定义,该数据不会经常更改,但即使发生更改,您也可以使用增量 MR 将新结果添加到现有计算中。

2.2 中的聚合框架将允许您按需执行大量此操作,但它当然不会像预先计算的值那样快,但在按需执行时比 MR 快得多。它无法处理您可以使用 MR 处理的大量结果集,但它更适合您事先不知道参数值的查询。

例如,如果您想计算特定纬度/经度内用户统计信息的总和,则不能使用 MR,因为该过滤器的组合太多,因此您需要在飞。

但是,如果您希望按城市进行计算,那么您可以想象在那里使用 MR,因为您可以坚持有限的一组城市并预先计算所有城市。

但总而言之,如果您的聚合指标值仅针对每个用户,那么当我更新用户对象时,我将首先计算并将值存储在用户对象中,正如我在第一段中所说的那样。是的,您要存储值和输入,但这种模型可以让您不必即时计算。

于 2012-10-11T14:45:59.427 回答