mongo
シェルを使って、下記のような books
コレクションに対して MapReduce をかけて、タグ情報のリスト(tags
コレクション)を生成する方法を示します。
{ title: 'Title 1', tags: ['AAA', 'BBB'] }
{ title: 'Title 2', tags: ['BBB', 'CCC'] }
{ title: 'Title 3', tags: ['CCC', 'AAA'] }
作成される tags
コレクションは、以下のようになることを想定しています。
{ "_id" : "AAA", "value" : 2 }
{ "_id" : "BBB", "value" : 2 }
{ "_id" : "CCC", "value" : 2 }
まずは、サンプルデータとなる books
コレクションを作成します。
use testdb;
// books コレクションの初期化
db.books.drop();
db.books.save({title: 'Title 1', tags: ['AAA', 'BBB']});
db.books.save({title: 'Title 2', tags: ['BBB', 'CCC']});
db.books.save({title: 'Title 3', tags: ['CCC', 'AAA']});
// 確認
print('books collection has been created');
db.books.find();
$ mongo < books.js
次に、books
コレクションに MapReduce をかけて、tags
コレクションを生成します。
use testdb;
var map = function() {
if (!this.tags) {
return;
}
this.tags.forEach(function(tag) {
emit(tag, 1);
});
};
var reduce = function(key, values) {
var sum = 0;
values.forEach(function(val) {
sum += val;
});
return sum;
};
db.runCommand({
mapReduce: 'books', // MapReduce をかけるコレクション
map: map, // Map 関数
reduce: reduce, // Reduce 関数
out: 'tags' // MapReduce の結果を格納するコレクション
});
$ mongo < mapreduce.js
実際に tags
コレクションが生成されているか確認してみます。
$ mongo testdb
> db.tags.find()
{ "_id" : "AAA", "value" : 2 }
{ "_id" : "BBB", "value" : 2 }
{ "_id" : "CCC", "value" : 2 }
できてますね!