使用MongoDB创建聚合的用户统计数据



我正在构建一个MongoDB数据库,该数据库将与Android应用程序一起使用。我有一个用户集合和一个记录集合。记录文件包括GPS轨迹,如起点和终点坐标、总时间、最高速度和距离。用户文档具有用户id、名字、姓氏等等。

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

我很困惑我是应该做一个map reduce并为用户创建一个聚合集合,还是应该用某种cron作业类型soliuton将这些统计数据添加到用户文档中。我读过很多关于MongoDB的map reduce和aggregation的指南,但我不明白这一点。

谢谢!

听起来你的聚合指标值是每个用户的,在这种情况下,我只需计算它们,并在更新当前坐标、速度等的同时将它们直接推送到用户对象中。它们查询起来既方便又快捷,如果你愿意,你可以进一步聚合它们。

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

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

因此,如果你的聚合统计数据是跨用户的,并且需要应用某种过滤器,那么它们需要根据一些数据快照进行计算。这里有两种方法:;

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

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

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

举个例子,如果你想计算某个特定纬度/经度内用户统计数据的总和,你就不能使用MR,因为该过滤器的组合太多了,所以你需要快速计算。

然而,如果你想按城市来计算,那么你可以想象在那里使用MR,因为你可以坚持一组有限的城市,只需预先计算所有的城市。

但总而言之,如果您的聚合指标值仅针对每个用户,那么当我更新用户对象时,我会首先计算并存储用户对象中的值,就像我在第一段中所说的那样。是的,您存储的是值和输入,但这是一个模型,可以节省您的计算时间。

最新更新