Playを使用しています!フレームワークのmorphia-mongodbモジュールであり、グループ集約を行うための優れた組み込み機能があることがわかります。残念ながら、すべての例は固定フィールドによるグループ化/集計のみを示していますが、計算フィールド(日ごとにグループ化されたタイムスタンプ)で集計する必要があります。誰かがこれへの正しいアプローチを知っているかどうか疑問に思いますか?
私はネイティブマップ/リデュースに頼ることができることを知っています(それ自体は理解するのに少し掘り下げたので、映画と上映時間を使用して、参照用にここに投稿しています):
DBCollection coll = Movie.col();
String map = "function() { " +
(this.showtime.getMonth() + 1) + '/' + this.showtime.getDate()}; "
+ "var key = {date: this.showtime.getFullYear() + '/'
+ (this.showtime.getMonth() + 1)
+ '/' + this.showtime.getDate()}; "
+ "emit(key, {count: 1}); }";
String reduce = "function(key, values) { var sum = 0; "
+ " values.forEach( function(value) {sum += value['count'];} );"
+ " return {count: sum}; }";
String output = "dailyShowingCount";
MapReduceOutput out = coll.mapReduce(
map, reduce, output, MapReduceCommand.OutputType.REPLACE, null);
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
for (Iterator<DBObject> itr = out.results().iterator(); itr.hasNext();) {
DBObject dbo = itr.next();
String compoundKeyStr = dbo.get("_id").toString();
String compoundValStr = dbo.get("value").toString();
DBObject compKey = (DBObject)JSON.parse(compoundKeyStr);
DBObject compVal = (DBObject)JSON.parse(compoundValStr);
//don't know why count returns as a float, but it does, so i need to convert
Long dCount = new Double(
Double.parseDouble(compVal.get("count").toString())
).longValue();
Date date = df.parse(compKey.get("date").toString());
}
ただし、morphiaモジュールを使用してこの集計を行うための洗練された組み込みの方法がすでにある場合は、代わりにそれを使用したいと思います。私が持っていた1つの考えは、Javaクラス(「getDay()」など)に仮想フィールドを作成し、それによってグループ化/集約することでした。誰かがこれを経験したことがありますか?