2011年9月19日月曜日

gmongoでキー関数を使用してグループ化する

オブジェクトに存在しないキー項目でグループ化するには、以下のコードのようにキー関数(keyf)を使用します。 以下の例では、日時ベースのデータを日付毎にグループ化しています。
@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:100])
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:100])
col.insert([store:"store_A",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 10, 17, 45).getTime(),
  sales:100])
col.insert([store:"store_C",
  "sales_timestamp":new GregorianCalendar(2011, 7, 11, 11, 10, 5).getTime(),
  sales:100])
for(obj in db.command(
[group :
  [
  ns:"stores",
  '$keyf': """
    function(obj){
      return {"dt":obj.sales_timestamp.getFullYear() + "/" +
        (obj.sales_timestamp.getMonth() + 1) + "/" +
        obj.sales_timestamp.getDate()
      };
    }
    """,
    initial:[scount:0],
    '$reduce': "function(obj,prev){ prev.scount++; }"
  ]
]).retval)
{
  println obj["dt"] + " - number of stores:${obj.scount}"
}

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

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

groovyとMongoDBのまとめ

0 件のコメント:

コメントを投稿