聚合运算
1.0.8版本增加的方法目前还没有简化,参数跟官方驱动是一致的。
建议在看这一章之前请先把MongoDB北大绿卡之Aggregation先过一遍
在Mongodb Plugin中,简化了聚合运算的使用,使你几乎可以不用学习成本的使用。我们来看下下面的例子:
MongoQuery query=new MongoQuery();
//先创建一个query对象,用于存放条件
query.use("student").eq("sex",1).descending("age").limit(10);
//查找student中性别为1且按年龄倒序的前十个
MongoAggregation aggregation=new MongoAggregation(query);
//创建聚合运算对象
logger.info(JSON.toJSONString(aggregation
.include("name","sex","age","teacherName")
//输出的内容中只含有name、sex、age和teacherName
.projection()
//如果是用了include、exclude、excludeId则必须加上
.lookup("teacher","teacherName","name","teacher")
//类似mysql的join查询,将teacherName字段中的值对应的teacher的name字段中的值的结果放在查询结果中的teacher字段中,这里是按照原生驱动放置的参数,有点绕~
.out("_output_")
//将结果输出到_output_集合中
.pipeline(聚合操作)
//放入官方驱动的Aggregates的方法生成的bson。
.aggregate()));
//开始运算
//我们来看下另一个求所有男生平均分数的例子
MongoQuery query=new MongoQuery();
query.use("student").eq("sex",1).descending("teacherName");
//根据老师名字倒序,由于是先检索排序再计算的,好的条件和排序可以加快运算速度。
MongoAggregation aggregation=new MongoAggregation(query);
logger.info(JSON.toJSONString(aggregation
.group("$teacherName",new MongoAccumulator().avg("result","$score"))
.aggregate()));
//在group中放置$字段名代表使用该表的这个字段来运划分不同的结果(如A老师和B老师下的学生的平均成绩),MongoAccumulator是MongoPlugin的封装好的公式,里面基本包含了mongodb java driver中的运算公式。在本例子中是计算平均数。以score字段为计算依据并将计算结果放入result字段中。