morphia是谷歌的一个针对mongodb的数据化持久框架,现在貌似已经迁移到mongodb中
morphia induction
morphia api for java
关于mongodb的介绍不在这里展示,直接进入主题:采用morphia实现对mongodb的复杂group统计
需求:有一个用户集合User,如下:
{
“_id” : ObjectId(“55bf10419d03fb1a88f990ba”),
“userName” : “user6”,
“password” : “123”,
“grade” : 98,
“classId” : 1,
“createTime” : ISODate(“2015-08-12T06:59:57.318Z”)
},
{
“_id” : ObjectId(“55d697fe3a6aae9affb43744”),
“userName” : “user”,
“password” : “123”,
“grade” : 30,
“classId” : 2,
“createTime” : ISODate(“2015-08-13T06:59:57.318Z”)
},
{
“_id” : ObjectId(“55ee48851db2fd2a72b1031f”),
“userName” : “user6”,
“password” : “123”,
“grade” : 43,
“classId” : 2,
“createTime” : ISODate(“2015-08-14T06:59:57.318Z”)
},
{
“_id” : ObjectId(“55ee517b1db2fd2a72b10320”),
“userName” : “user6”,
“password” : “124”,
“grade” : 24,
“classId” : 1,
“createTime” : ISODate(“2015-08-19T06:59:57.318Z”)
}
总共四条记录,现在的需求是:按userName和classId进行分组统计数量和总的grade,且成绩需要大于0,sql如下:
select userName,classId,count(*) as count,sum(case when grade> 0 then grade else 0 end) as totalGrade from Users where grade > 0 group by userName,classId order by userName
查看morphia的API如下图
可以知道用aggregation就好。
话不多说,上代码
MorphiaAggregation .java如下
package com.marstor.dms.base;
import static org.mongodb.morphia.aggregation.Group.first;
import static org.mongodb.morphia.aggregation.Group.grouping;
import static org.mongodb.morphia.aggregation.Group.id;
import static org.mongodb.morphia.aggregation.Group.sum;
import java.util.Iterator;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.aggregation.Accumulator;
import org.mongodb.morphia.aggregation.AggregationPipeline;
import org