2011年10月20日木曜日

gmongoでMapReduceを使用してフィールド項目にない項目で合計を求める

gmongoでMapReduceを使用してメンバー項目以外の項目で合計を求めるには、以下のコードを実行します。 以下のコードでは、タイムスタンプのフィールドから日付ごとの集計を行います。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([store:"store_A",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 12, 11, 30).getTime(),
  sales:110])
col.insert([store:"store_B",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 18, 31, 15).getTime(),
  sales:100])
col.insert([store:"store_C",
  "sales_timestamp":new GregorianCalendar(2011, 7, 10, 19, 11, 10).getTime(),
  sales:120])
col.insert([store:"store_A",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 10, 17, 45).getTime(),
  sales:100])
col.insert([store:"store_B",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 11, 10, 5).getTime(),
  sales:130])
// MapReduceで日ごとの売上を取得
println col.mapReduce(
  /* map */ """function(){
    emit(this.sales_timestamp.getFullYear() + "/" +
        (this.sales_timestamp.getMonth() + 1) + "/" +
        this.sales_timestamp.getDate(), {sales:this.sales});
  }""",
  /* reduce */ """function(key, values){
    var total = 0;
    for(var vi = 0;vi<values.length;vi++){
      total += values[vi].sales;
    }
    return {sales: total};
  }""",
  /* outputTarget */"mr_result",
  /* query */ new BasicDBObject()
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

0 件のコメント:

コメントを投稿