Mongodb的mapreduce如何实现只更新现有表的部分字段,而不是整个文档
给我你的怀抱
给我你的怀抱 2017-04-24 15:59:55
0
1
579

MapRedue 的输出

{"out", option }

option可以是下面几个选项:

  • "collection name" – mapReduce的输出结果会替换掉原来的collection,collection不存在则创建
  • { replace : "collection name" } – 同上
  • { merge : "collection name" } – 将新老数据进行合并,新的替换旧的,没有的添加进去
  • { reduce : "collection name" } – 存在老数据时,在原来基础上加新数据(即 new value = old value + mapReduce value)
  • { inline : 1 } – 不会创建collection,结果保存在内存里,只限于结果小于16MB的情况
    如果用collection name作option不能与其它option一起使用,其它则可以,如:

    • { "out", { replace : "collection name", db : "db name" } }

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有没有相应的解决方案。

给我你的怀抱
给我你的怀抱

全員に返信(1)
小葫芦

を使用すると、指定した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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!