MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB MapReduce pembaruan di tempat bagaimana

Anda pasti bisa melakukan ini. Saya akan menjawab pertanyaan Anda satu per satu:

1.Anda dapat menentukan kueri bersama dengan pengurangan peta Anda, yang memfilter kumpulan objek yang akan diteruskan ke fase peta. Di shell mongo, ini akan terlihat seperti (dengan asumsi m dan r adalah nama fungsi mapper dan peredam Anda masing-masing):

> db.coll.mapReduce(m, r, {query: {$or: [{"recently-voted": true}, {"hourly-score": {$gt: 0}}]}})

2.Langkah #1 akan memungkinkan Anda menggunakan mapper Anda pada semua dokumen dengan setidaknya satu suara dalam satu jam terakhir (atau dengan recently-voted disetel ke true), tetapi tidak semua suara akan diberikan dalam satu jam terakhir. Jadi, Anda perlu memfilter daftar di mapper Anda, dan hanya mengeluarkan suara yang ingin Anda hitung:

function m() {
  var hour_ago = new Date() - 3600000;
  this.votes.forEach(function (vote) {
    if (vote.ts > hour_ago) {
      emit(/* your key */, this.vote.a);
    }
  });
}

Dan untuk mengurangi:

function r(key, values) {
  var sum = 0;
  values.forEach(function(value) { sum += value; });
  return sum;
}

3.Untuk memperbarui tabel skor per jam, Anda dapat menggunakan reduceOutput opsi untuk memetakan-mengurangi, yang akan memanggil peredam Anda dengan nilai yang dipancarkan, dan nilai yang disimpan sebelumnya dalam koleksi keluaran, (jika ada). Hasil dari pass tersebut akan disimpan ke dalam output collection. Ini terlihat seperti:

> db.coll.mapReduce(m, r, {query: ..., out: {reduce: "output_coll"}})

Selain mengurangi output, Anda dapat menggunakan merge yang akan menimpa dokumen dalam koleksi keluaran dengan yang baru dibuat (tetapi meninggalkan dokumen apa pun dengan _id berbeda dari _id s dibuat oleh pekerjaan m-r Anda), replace , yang secara efektif merupakan operasi drop-and-create dan merupakan default, atau gunakan {inline: 1} , yang akan mengembalikan hasilnya langsung ke shell atau ke driver Anda. Perhatikan bahwa saat menggunakan {inline: 1} , hasil Anda harus sesuai dengan ukuran yang diperbolehkan untuk satu dokumen (16MB dalam rilis MongoDB terbaru).

(4.)Anda dapat menjalankan tugas pengurangan peta di sekunder ("slave"), tetapi karena sekunder tidak dapat menerima penulisan (itulah yang membuatnya menjadi sekunder), Anda hanya dapat melakukan ini saat menggunakan output sebaris.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. cara memperbarui objek bersarang dari dokumen luwak hanya untuk kunci yang disediakan

  2. Bagaimana cara memanggil db.eval() melalui luwak?

  3. Persimpangan indeks vs indeks gabungan?

  4. Bagaimana cara mengonversi BSON Timestamp dari Mongo changestream ke tanggal?

  5. Kueri di mana jumlah dua bidang kurang dari nilai yang diberikan