使用MongoDB,重新使用Map / Reduce结果的简单方法是什么?

时间:2010-09-23 03:27:23

标签: mongodb mapreduce mongoid

例如,在执行Google Analytics时,可能需要10秒才能执行map / reduce运行。运行后,如果其他网页可以使用该结果,那么每页将节省10秒。

以某种方式缓存map / reduce结果会很好。

可以在db中记录成功的map / reduce运行为map_reduce_result_[timestamp],然后将此时间戳保存在MongoDB中的db.run_log中。例如,此时间戳是UNIX纪元时间。因此,当其他页面需要访问结果时,它们可以获得最大时间戳,然后只查找存储在MongoDB中的结果。但这样做有点像黑客,并想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:10)

您的方法会将每个map-reduce结果保存在单独的集合中。如果您需要访问这些“历史”结果,这很好。

如果您只对 last 结果感兴趣,则可以使用单一集合作为缓存。您可以使用out选项指定map-reduce作业的输出集合。

db.collection.mapReduce(map, reduce, { out: "cachedResult" });

永久cachedResult集合将包含结果。

正如您在the documentation中所读到的那样,map-reduce作业在执行时仍将使用临时集合。此临时集合在完成时以原子方式重命名为输出集合。这意味着您可以使用相同的输出集合安全地重新运行map-reduce作业,而不必担心地图缩减时无效的缓存。