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

cara menghitung hitungan dan hitungan unik pada dua bidang dalam fungsi pengurangan mongo

Anda benar-benar dapat melewatkan objek arbitrer pada parameter kedua dari panggilan emisi. Itu berarti Anda dapat memanfaatkan ini dan menyimpan userid di dalamnya. Misalnya, fungsi peta Anda dapat terlihat seperti ini:

var mapFunc = function() {
  if (this.track_redirect) {
    var tempDoc = {};
    tempDoc[this.track_userid] = 1;

    emit(this.track_redirect, {
      users_clicked: tempDoc,
      total_clicks: 1
    });
  }
};

Dan fungsi pengurangan Anda mungkin terlihat seperti ini:

var reduceFunc = function(key, values) {
  var summary = {
    users_clicked: {},
    total_clicks: 0
  };

  values.forEach(function (doc) {
    summary.total_clicks += doc.total_clicks;
    // Merge the properties of 2 objects together
    // (and these are actually the userids)
    Object.extend(summary.users_clicked, doc.users_clicked);
  });

  return summary;
};

Properti users_clicked dari objek ringkasan pada dasarnya menyimpan id setiap pengguna sebagai properti (karena Anda tidak dapat memiliki properti duplikat, Anda dapat menjamin bahwa itu akan menyimpan pengguna unik). Perhatikan juga bahwa Anda harus berhati-hati dengan fakta bahwa beberapa nilai yang diteruskan ke fungsi pengurangan dapat merupakan hasil dari pengurangan sebelumnya dan kode contoh di atas memperhitungkannya. Anda dapat menemukan lebih banyak tentang perilaku tersebut di dokumen di sini .

Untuk mendapatkan hitungan unik, Anda dapat memasukkan fungsi finalizer yang dipanggil saat fase pengurangan selesai:

var finalFunc = function(key, value) {
  // Counts the keys of an object. Taken from:
  // http://stackoverflow.com/questions/18912/how-to-find-keys-of-a-hash
  var countKeys = function(obj) {
    var count = 0;

    for(var i in obj) {
      if (obj.hasOwnProperty(i))
      {
        count++;
      }
    }

    return count;
  };

  return {
    redirect: key,
    total_clicks: value.total_clicks,
    unique_clicks: countKeys(value.users_clicked)
  };
};

Terakhir, Anda dapat menjalankan tugas pengurangan peta seperti ini (modifikasi atribut out agar sesuai dengan kebutuhan Anda):

db.users.mapReduce(mapFunc, reduceFunc, { finalize: finalFunc, out: { inline: 1 }});



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grup Mongo berdasarkan bulan menggunakan waktu milidetik UNIX

  2. MongoDB di Azure:Bagaimana Cara Memilih Jenis Instans yang Tepat?

  3. luwak findOne dengan penyortiran

  4. MongoDB menyimpan array ObjectId's

  5. kelompokkan pengumpulan MongoDB berdasarkan bulan dan pendapatan agregat untuk grafik churn/pendapatan