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

MongoDB可以在多个文档上运行相同的操作而不必查询每个文档吗?,mongodb,mapreduce,Mongodb,Mapreduce,我正在寻找一种方法来更新名为“posts”的集合中的每个文档 帖子会定期更新,更新内容包括受欢迎程度(站点范围内的受欢迎程度)和强度(与特定用户的估计相关性),每一个都来自不同的来源。我需要做的是在每个帖子上增加人气和力量,以获得第三个领域,相关性。相关性用于对帖子进行排序 class Post include Mongoid::Document field :popularity field :strength field :relevance ... 目前的实施情况如

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

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

class Post
  include Mongoid::Document

  field :popularity
  field :strength
  field :relevance
  ...
目前的实施情况如下:

1) 我将其映射/简化为一个单独的集合,该集合存储帖子id和计算出的相关性

2) 我会根据地图结果分别更新每个帖子

这是大量的单独更新查询,将每个帖子映射到自己的结果(1对1)似乎很愚蠢,只会再次更新帖子。有没有可能在原地进行乘法,或者进行某种原地映射

有没有可能在原地进行乘法,或者进行某种原地映射

没有

这里最理想的方法是让Map/Reduce在帖子完成后直接更新帖子。不幸的是,M/R没有这种能力。理论上,您可以在“finalize”阶段发布更新,但这将在碎片化环境中崩溃

然而,如果您所做的只是一个简单的乘法,那么您根本不需要M/R。您可以只运行一个大的
for
循环,或者在更新
:popularity
:strength
时连接
save
事件以更新
:相关性

MongoDB没有触发器,因此无法自动执行此操作。但是您使用的是一个业务层,这正是放置这种逻辑的地方

有没有可能在原地进行乘法,或者进行某种原地映射

没有

这里最理想的方法是让Map/Reduce在帖子完成后直接更新帖子。不幸的是,M/R没有这种能力。理论上,您可以在“finalize”阶段发布更新,但这将在碎片化环境中崩溃

然而,如果您所做的只是一个简单的乘法,那么您根本不需要M/R。您可以只运行一个大的
for
循环,或者在更新
:popularity
:strength
时连接
save
事件以更新
:相关性


MongoDB没有触发器,因此无法自动执行此操作。但是您使用的是一个业务层,正是放置这种逻辑的地方。

如果我的解决方案有效,这可能是重复的:谢谢链接。我对覆盖原始集合中的整个文档犹豫不决,因为随着用户在网站上采取行动,后期集合会定期更新,我会担心并发性。如果我的解决方案有效,这可能是重复的:感谢链接。我对覆盖原始集合中的整个文档犹豫不决,因为随着用户在站点上的操作,后期集合会定期更新,我会担心并发性。谢谢您的回答。然而,帖子实际上是特定于用户的,因此相同的实际内容可能会被推送到许多用户提要中,但其中包含特定于该用户的信息(强度是特定于用户的)。强度和受欢迎程度都是使用原子更新更新的,因此,before_保存不起作用。虽然我可以运行一个大的for循环,但这涉及到每个帖子的两个查询(一个要获取,一个要保存),而对于M/R,我有一个M/R,然后每个结果都有一个原子更新。谢谢你的回答。然而,帖子实际上是特定于用户的,因此相同的实际内容可能会被推送到许多用户提要中,但其中包含特定于该用户的信息(强度是特定于用户的)。强度和受欢迎程度都是使用原子更新更新的,因此,before_保存不起作用。虽然我可以运行一个大的for循环,但这涉及到每个帖子的两个查询(一个要获取,一个要保存),而对于M/R,我有一个M/R,然后每个结果有一个原子更新。