MapReduceは、クライアントで操作を行わずにサーバー上のドキュメントを処理できる場合に適している可能性があります(DBサーバーで文字列を分割する機能がないため(未解決の問題)。
map
から始めます 働き。以下の例(おそらくより堅牢である必要があります)では、各ドキュメントがmap
に渡されます。 関数(this
として )。コードはsummary
を探します フィールドがあり、そこにある場合は小文字にし、スペースで分割してから、1
を出力します。 見つかった単語ごとに。
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
}
}
}
};
次に、reduce
関数、それはmap
によって見つけられたすべての結果を合計します 関数であり、emit
であった各単語の個別の合計を返します 上記のとおりです。
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
最後に、mapReduceを実行します:
> db.so.mapReduce(map, reduce, {out: "word_count"})
サンプルデータを使用した結果:
> 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 }