検索

ホームページ  >  に質問  >  本文

Mongodb的mapreduce如何实现只更新现有表的部分字段,而不是整个文档

MapRedue 的输出

{"out", option }

option可以是下面几个选项:

merge选项的可能性最大,但是经过实验发现,它总是会根据“_id”更新整个文档,而不是只更新reduce或者finalize出来的对象里有的字段。

比如我一个已经存在的集合A,有10几个字段,没有emps字段,我运行一个MR操作,reduce出来的是{key,emps:[["0132",70],["1443",30]]},想把emps字段添加到现有的集合A上,结果我10几个字段都没有了,就只剩下emps字段了。
本来想在reduce里引用db对象手工update的,但是现在的版本都不让引用db对象了。
现在只能在mapreduce后,执行一个forEach,手工执行update。
请问mapreduce有没有相应的解决方案。

给我你的怀抱给我你的怀抱2819日前644

全員に返信(1)返信します

  • 高洛峰

    高洛峰2017-04-24 16:01:55

    を使用すると、指定したreduce関数(リデューサー)を使用して結果セット内のreduce既存の結果新たに計算された結果が計算され、最終結果が保存されます。ここで最も重要なことは、マッパーによって出力される中間結果を最終結果と同じ形式にすることです。このようなリデューサは 2 つの場所で使用され、1 つはリデュースで、もう 1 つは出力で使用されます。これらの形式、特に階層が同じであれば、記述がはるかに簡単になります。リデューサーは、複数の結果をマージすることだけを担当すると理解できます。マッパーが中間結果のみを出力する場合は、リデューサーを経由せずに、それを最終結果として直接使用する必要があります。実際、MongoDB では、キーが 1 つのマッパー出力のみに対応する場合、実際にはリデューサーを経由せずに直接出力されます。

    http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/#output-to-a-collection-with-an-action

    出力コレクションがすでに存在する場合は、新しい結果を既存の結果とマージします。既存のドキュメントに新しい結果と同じキーがある場合、reduce 関数を新しいドキュメントと既存のドキュメントの両方に適用し、既存のドキュメントを結果で上書きします。

    返事
    0
  • キャンセル返事