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 }
できてますね!