C#, MongoDB: MapReduceで集計処理2

 前回とりあえずメモがてら、このブログで行ってるMapReduce処理を載せた。さらに引き続きMapReduce処理をもうちょい学んでみた。
https://absurd.azurewebsites.net/Article/5

 前回はMapReduce処理結果を表示するために取ってきていた。MapReduce処理実行時のオプションとして、結果を取ってくる以外にそのままDBへ保存することもできる。
 ただ保存には注意が必要なように思う。
1.Replace
 コレクション内すべてのドキュメントを消し、MapReduce処理結果を保存
2.Merge
 Update命令と同様。同IDのドキュメントがなければInsertされる
3.Reduce
 同IDのドキュメントの置換
4.Inline
 結果をクライアントへ返す

 たぶん汎用性が高いのはMergeあたりか。今回はMapReduce結果それぞれにコレクションを用意したのでReplaceを使ったけど。
 下記がこのブログのサイドバーのタグ集計を行っているMapReduce処理。
public static void MapReduceTag()

{
var collection = DbConnection.db.GetCollection<BsonDocument>("entry");
var map = (BsonJavaScript)@"
function() {
emit('tag', this.tag);
}";

var reduce = (BsonJavaScript)@"
function(key, values) {
var result = {};

values.forEach(function(value){
value.forEach(function(v){
if (!(v in result)) {
result[v] = 1;
} else {
result[v] += 1;
}
});
});

return result;
}";

var options = new MapReduceOptions<BsonDocument, object>();
var filter = Builders<BsonDocument>.Filter.Eq("showFlg", true);
options.Filter = filter;
options.OutputOptions = MapReduceOutputOptions.Replace("tagInfo");

collection.MapReduce(map, reduce, options);

}

comment: 0