MongoDB, C#: MapReduceで集計処理

 MongoDBにもドキュメントの集計を行う機能がある。それがMapReduce。
Gihyo MongoDBでの集計処理

 このブログのサイドバーに、タグごとにそれがついた記事が何件あるかを集計してある。この集計にMapReduceを使っている。
 タグは一件の記事ごとにArrayに入れてある。集計では公開記事のそのArrayを全件とってきて、中のタグをカウントしている。というわけでそのコード。

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 filter = Builders<BsonDocument>.Filter.Eq("showFlg", true);
var options = new MapReduceOptions<BsonDocument, Dictionary<string, object>>();
options.Filter = filter;

var results = collection.MapReduce(map, reduce, options);
var result = results.First();
var json = result.Values.Last().ToJson();
var dict = (Dictionary<string, int>)BsonSerializer.Deserialize(json, typeof(Dictionary<string, int>));


 MongoDBからDriverが受け取ったBSONから、どうすれば直接集計結果のKeyValueペアを抜き出せるかわからなかった。なので必要な部分だけJSON文字列で抜き取って、それをデシリアライズして辞書型にした。
comment: 0