MongoDB可以在许多文档上运行相同的操作而无需查询每个文档吗?

时间:2012-02-01 19:24:16

标签: mongodb mapreduce

我正在寻找一种方法来更新名为“posts”的集合中的每个文档。

帖子定期更新,具有受欢迎程度(全站点受欢迎程度)和强度(与该特定用户的估计相关性),每个来自不同来源。我需要做的是在每个帖子上增加人气和力量,以获得第三个领域,即相关性。相关性用于对帖子进行排序。

class Post
  include Mongoid::Document

  field :popularity
  field :strength
  field :relevance
  ...

目前的实施如下:

1)我将/ map减少到一个单独的集合,该集合存储了帖子ID和计算的相关性。

2)我从地图中逐个更新每个帖子减少结果。

这是大量的个人更新查询,将每个帖子映射到自己的结果(1对1)似乎很愚蠢,只是为了再次更新帖子。是否有可能在适当的位置繁殖,或做某种就地地图?

1 个答案:

答案 0 :(得分:0)

  

是否可以在适当的位置繁殖,或者做某种就地地图?

不。

理想的做法是让Map / Reduce在完成后直接更新Post。不幸的是,M / R没有这种能力。从理论上讲,您可以从“最终化”阶段发布更新,但这会在分片环境中崩溃。

但是,如果您所做的只是一个简单的乘法,那么您根本不需要M / R.您可以只运行一个较大的for循环,也可以在save:relevance更新时将:popularity事件与:strength相关联。

MongoDB没有触发器,因此无法自动执行此操作。但是你正在使用业务层,这是放置这种逻辑的确切位置。