保持Map的策略减少后续查询的结果

时间:2010-10-26 16:40:04

标签: mongodb mapreduce nosql

我正在使用Map Reduce与MongoDB。简化场景:有用户,物品和东西。物品包括任何数量的东西。每个用户都可以评价事物。 Map reduce用于计算每个项目上每个用户的总评分。这是一个复杂的公式,使用项目中每件事物的评级和一天中的时间 - 这不是你可以索引的东西,因此map-reduce是计算它的理想方法。

问题是:使用Map计算结果减少人们用来在NOSQL数据库中维护这些每用户结果集合的策略?

1)按需自动删除:将它们保持一段时间,然后删除它们;当用户发出新请求时,根据需要重新生成它们?

2)随需应变永远不会删除:无限期地保持它们。当用户发出请求并且收集已超过使用日期时,请重新生成它。

3)预定:运行常规流程以更新所有用户的所有结果集合?

4)其他?

1 个答案:

答案 0 :(得分:1)

最佳策略取决于地图缩减作业的性质。

如果您为每个用户使用单独的map-reduce调用,我会选择第一个或第二个策略。第二种策略优于第一种策略的优势在于您始终可以获得结果。因此,当用户发出请求并且结果已过时时,您仍然可以将旧结果呈现给用户,同时在后台运行新的map-reduce以为下一个请求生成新结果。这具有以下优点:

  • 用户无需等待map-reduce完成,这一点很重要,如果map-reduce可能需要一段时间才能完成。例外当然是第一个map-reduce调用;在这一点上,没有旧的结果。
  • 您只为活动用户自动运行map-reduce,从而减轻了数据库的负担。

如果您正在为所有用户使用单一,应用程序范围的map-reduce调用,则第三种策略是最佳方法。您可以通过指定output collection轻松实现此目的。这种方法的优点是:

  • 您可以轻松控制结果的新鲜度。如果您需要更多最新结果,或者需要减少数据库的负载,则只需调整计划。
  • 您的应用程序代码不负责管理map-reduce调用,这简化了您的应用程序。

如果用户只能看到自己的评分,我会选择一两个策略,或者在用户个人资料中加入lastActivity个时间戳,然后运行应用程序范围内的预定map-reduce作业。用户的活动子集(策略3)。如果用户可以看到任何其他用户的评级,我也会选择策略3,因为这会大大降低应用程序的复杂性。