gmongoでグループ毎の最小値・最大値を求めるには、以下のコードのようにgroupを使用します。
@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([country:"Japan", store:"store_A", sales:100])
col.insert([country:"Japan", store:"store_B", sales:120])
col.insert([country:"Japan", store:"store_C", sales:170])
col.insert([country:"United States", store:"store_D", sales:80])
col.insert([country:"United States", store:"store_E", sales:200])
col.insert([country:"United States", store:"store_F", sales:190])
col.insert([country:"United States", store:"store_G", sales:100])
// 国ごとの最小値・最大値を取得
for(obj in col.group(/* key */new BasicDBObject([country:true]),
/* condition */new BasicDBObject(),
/* initial */new BasicDBObject([smin:0, smax:0, firstobj:true]),
/* reduce */"""
function(obj,prev){
if( prev.firstobj == true ){
prev.smin = obj.sales;
prev.smax = obj.sales;
prev.firstobj = false;
}
if( prev.smin > obj.sales ){prev.smin = obj.sales;}
if( prev.smax < obj.sales ){prev.smax = obj.sales;}
}
"""
)){
println obj["country"] + " min:${obj.smin} max:${obj.smax}"
}
動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2
関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo
groovyとMongoDBのまとめ
グループ分けして集計する