cari

Rumah  >  Soal Jawab  >  teks badan

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

给我你的怀抱给我你的怀抱2801 hari yang lalu625

membalas semua(1)saya akan balas

  • 高洛峰

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

    Gunakan reduce, ia akan mengira keputusan sedia ada dan hasil yang baru dikira dalam set hasil menggunakan fungsi pengurangan (reducer) yang anda berikan Hasil akhir disimpan. Perkara yang paling penting di sini adalah untuk menjadikan hasil perantaraan keluaran oleh pemeta mempunyai format yang sama dengan keputusan akhir. Pengurangan sedemikian digunakan di dua tempat, sekali dalam mengurangkan dan sekali dalam output Jika mereka mempunyai format yang sama, terutamanya hierarki, ia akan menjadi lebih mudah untuk menulis. Pengurang boleh difahami sebagai hanya bertanggungjawab untuk menggabungkan berbilang hasil Jika pemeta hanya mengeluarkan hasil perantaraan, ia harus digunakan secara langsung sebagai hasil akhir tanpa melalui pengurang. Malah, dalam MongoDB, apabila kunci sepadan dengan hanya satu output pemeta, ia sememangnya dikeluarkan secara langsung tanpa melalui pengurang.

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

    Gabungkan hasil baharu dengan hasil sedia ada jika koleksi keluaran sudah wujud Jika dokumen sedia ada mempunyai kunci yang sama dengan hasil baharu, gunakan fungsi pengurangan pada kedua-dua dokumen baharu dan sedia ada dan tulis ganti dokumen sedia ada dengan. hasil.

    balas
    0
  • Batalbalas