0

我有多个集合,并且正在根据它们的两个内容通过 mapReduce 创建一个信息集合。在我的 reduce 方法中,我如何根据源集合应用条件逻辑,或者它是否是输出集合中先前存在的键。

将集合 A 缩减为信息集合时:

  • 我想对输入集合特定的字段子集的值求和并覆盖这些字段。我不希望信息集合中现有键的值包含在总和中。
  • 如果信息集合中存在键,我想只覆盖那些字段,如果键存在,则保留其他字段的值。

将集合 B 合并到信息集合中时:

  • 我想有条件地用集合 B 中的字段子集覆盖
  • 如果键存在,则保留其他字段的值。

目前我正在尝试以下方法:

  • 对于每个发出统一值的源集合,我都有一个映射函数。发出的值有一个字段“source”,它指示它来自哪个集合。
  • 我有一个 reduce 函数。它所做的第一件事是创建一个结构类似于统一值的对象。
  • 我有一个 finalize 函数,将源字段设置为“final”,表示现有密钥。
  • reduce 函数检查源值,并尝试辨别要使用的逻辑。如果 Collection A 进行求和,如果 B 它替换,如果 Final 它尝试遵循合并逻辑。
  • 我使用 reduce 选项运行 mapReduce 来更新键。

问题

  • 我最近意识到 finalize 将被多次调用。这消除了我辨别应该在 reduce 中应用什么逻辑的能力。

  • 如何基于源集合应用条件逻辑,或者它是否是我的 reduce 方法中先前存在的键?

4

1 回答 1

0

如何基于源集合应用条件逻辑,或者它是否是我的 reduce 方法中先前存在的键?

为此,您需要将“信息”集合中的数据包含在发送到 reduce() 的数据中。为此,使用“减少”操作进行输出。请参阅使用操作输出到集合。从集合 A(或 B)减少数据后,“减少”操作指示 Mongo 然后减少此数据和输出集合中记录的交集(按键)。

如果您的 map() 生成的键已经存在于“信息”集合中,reduce 将在新记录(来自 A 或 B)和现有记录(来自“信息”)上运行。显然,这将意味着您的 reduce 函数变得更加复杂,但至少您拥有应用条件逻辑所需的所有数据。

于 2013-05-03T00:38:36.967 回答