Mongo mapReduce,多个源集合,有条件地包含来自现有密钥的值

时间:2013-05-02 18:38:59

标签: mongodb mapreduce

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

将收集A减少到信息收集中时:

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

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

  • 我想要使用集合B
  • 中的字段子集进行有条件的覆盖
  • 如果密钥存在,则保留其他字段的值。

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

  • 我为每个发出统一值的源集合都有一个map函数。发出的值有一个字段“source”,表示它来自哪个集合。
  • 我有一个减少功能。它首先要做的是创建一个像统一值一样的对象。
  • 我有一个finalize函数,它将源字段设置为'final',表示现有密钥。
  • reduce函数检查源值,并尝试辨别要使用的逻辑。如果收集A它执行总和,如果它替换了B,如果它最终尝试遵循合并逻辑。
  • 我使用reduce选项运行mapReduce,以更新密钥。

问题

  • 我最近意识到finalize将被多次调用。这使我无法辨别出应该在reduce中应用的逻辑。

  • 如何根据源集合应用条件逻辑,或者如果它是我的reduce方法中以前存在的键?

1 个答案:

答案 0 :(得分:0)

  

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

要做到这一点,您需要来自"信息"的数据。要包含在发送到reduce()的数据中的集合。为此,输出"减少"行动。见Output to a Collection with an Action。在减少来自集合A(或B)的数据之后,"减少"操作指示Mongo然后减少此数据的交集(按键)并在输出集合中记录。

如果你的map()生成了"信息中已存在的密钥" collection,reduce将在新记录(来自A或B)和现有记录(来自"信息")上运行。显然,这意味着你的reduce函数变得更复杂,但至少你拥有应用条件逻辑所需的所有数据。