我正在构建一个可以与Android应用程序一起使用的MongoDB数据库。我有一个用户集合和一个记录集合。记录文件包括GPS轨迹,例如开始和结束坐标,总时间和最高速度和距离。用户文档具有用户ID,名字,姓氏等。
我想为每个用户提供汇总统计信息,总结总距离,总时间,总平均速度和迄今为止的最高速度。
我很困惑,如果我应该做一个地图缩小并为用户创建一个聚合集合,或者我是否应该使用某种cron作业类型soliuton将这些统计数据添加到用户文档中。我已经阅读了许多有关MongoDB的地图缩减和聚合的指南,但无法弄清楚这一点。
谢谢!
答案 0 :(得分:0)
听起来你的聚合指标值是按用户的,在这种情况下,我会简单地计算它们并将它们直接推送到用户对象,就像你更新当前的合作者,速度等一样。他们会很好并且容易(和快速)查询,如果你愿意,你可以进一步聚合它们。
当我说预先计算时,我不是指MapReduce,你将其用作批处理,我只是指计算更新用户对象。
如果您的汇总统计信息是跨用户编译的,那么您仍然可以在更新时预先计算它们,但如果您还需要能够根据某些其他条件或过滤器查询这些汇总统计信息,例如,“告诉我x区域内所有用户的总行进距离”,然后根据组合的数量,您可能无法涵盖所有预先计算的用户。
因此,如果您的汇总统计数据是跨用户的,并且需要某种过滤器应用,则需要从某些数据快照计算出来。这里有两种方法;
你需要使用MapReduce,如果你有一个 LOT 的历史数据你想要处理,你可以预先计算结果以便以后快速阅读。根据我的定义,数据不会经常变化,但即使这样,您也可以使用增量MR将新结果添加到现有计算中。
2.2中的聚合框架将允许您按需执行大量此操作,但它当然不会像预先计算的值那样快,但在按需执行时比MR更快。它无法处理您可以使用MR执行的高容量结果集,但它更适合于您事先不知道参数值的查询。
举例来说,如果您想计算特定纬度/经度内用户统计数据的总和,则无法使用MR,因为该过滤器的组合太多,因此您需要执行此操作在飞行中。
但是,如果你想要城市,那么你可以想象在那里使用MR,因为你可以坚持一组有限的城市而只是预先计算它们。
但总结一下,如果您的聚合指标值仅为每个用户,那么我将在更新用户对象时计算并存储用户对象内的值,如我在第一段中所述。是的,您存储的是值和输入,但这是可以节省您必须动态计算的模型。