MapReduce mungkin cocok yang dapat memproses dokumen di server tanpa melakukan manipulasi pada klien (karena tidak ada fitur untuk membagi string di server DB (masalah terbuka).
Mulailah dengan map
fungsi. Pada contoh di bawah ini (yang mungkin perlu lebih kuat), setiap dokumen diteruskan ke map
fungsi (sebagai this
). Kode mencari summary
bidang dan jika ada, huruf kecil, pisahkan pada spasi, dan kemudian memancarkan 1
untuk setiap kata yang ditemukan.
var map = function() {
var summary = this.summary;
if (summary) {
// quick lowercase to normalize per your requirements
summary = summary.toLowerCase().split(" ");
for (var i = summary.length - 1; i >= 0; i--) {
// might want to remove punctuation, etc. here
if (summary[i]) { // make sure there's something
emit(summary[i], 1); // store a 1 for each word
}
}
}
};
Kemudian, di reduce
fungsi, itu menjumlahkan semua hasil yang ditemukan oleh map
fungsi dan mengembalikan total diskrit untuk setiap kata yang emit
tercantum di atas.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Terakhir, jalankan mapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
Hasil dengan data sampel Anda:
> db.word_count.find().sort({value:-1})
{ "_id" : "is", "value" : 3 }
{ "_id" : "bad", "value" : 2 }
{ "_id" : "good", "value" : 2 }
{ "_id" : "this", "value" : 2 }
{ "_id" : "neither", "value" : 1 }
{ "_id" : "or", "value" : 1 }
{ "_id" : "something", "value" : 1 }
{ "_id" : "that", "value" : 1 }