使用MongoTemplate管理MongoDB的一些查询操作(Java)

说明:这里主要是分两种情况 一是采用org.springframework.data.mongodb.core.aggregation.Aggregation,用于组合一个统计需要的元素+Criteria
二是采用org.springframework.data.mongodb.core.mapreduce.GroupBy+Criteria
下面说一下这两种方法操作MongoDB的用法:
1.MongoTemplate mongoTemplate;
组织查询条件:
Criteria c=Criteria.where("applNo").is("").and("levelCode").is("");
2.实例化查询model
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(c));
/* 注意这里还可以添加其他的查询条件,条件之间用","隔开*/
Aggregation.unwind("subStateList"),//需要一个文档数组,并将它们作为一个文档流返回。这里指的就是要查询的对象属性为数组类型的
group("$subStateList.polCode"),//需要根据分组的字段
Aggregation.group("$subStateList.polCode").sum("subStateList.premium").as("sumPremium")//这个就是根据上面的介绍来进行根据某个字段来进行分组然后聚合然后赋值给自定义的属性


//执行查询的操作
AggregationResults<GrpInsured> aggregate = mongoTemplate.aggregate(aggregation, 需要查询的集合名称, 集合对应Model【GrpInsured】.class);
eg:
AggregationResults<FSHP> aggregate = getMongoTemplate().aggregate(aggregation, "FSHP", FSHP.class);


//取得查询出来的数据
//通过调试可知道,查询出的结果存放在aggregate.getRawResults().get("result")中;
BasicDBList bdbl =(BasicDBList) aggregate.getRawResults().get("result");


//循环取得数据
for(int i=0;i<bdbl.size();i++){   
 BasicDBObject obj=(BasicDBObject) bdbl.get(i);   
 System.out.println("id:"+obj.getString("_id")+">>>>sumPremium:"+obj.getDouble("sumPremium"));
}


(以上方法的好处是可以采用聚合函数、可以使用groupby,也可以不适用groupby)




2.第二种方法
//创建查询的条件
Criteria cts2=new Criteria();
//时间条件
cts2.and("NYRQ").gte(date1).lte(date2); //">="


//创建查询的实体
GroupBy groupBy2=new GroupBy();
groupBy2 = GroupBy.key("IsDangerous").initialDocument("{gzcs:0,cs:0}").reduceFunction("function(doc, prev){prev.gzcs+=Number(doc.GZCS);prev.cs+=Number(doc.CS)}");


//说明:key为分组的字段,initialDocument()为自定义的查询出来的字段名,reduceFunction()为查询时候的函数操作


//执行查询的操作
GroupByResults<FSHP> gb =getMongoTemplate().group(cts2,"FSHP", groupBy2, FSHP.class);


//取得查询的数据
BasicDBList baclist = (BasicDBList)gb.getRawResults().get("retval");//取得查询的数据,retval是返回的数据字段名 


//遍历取得的数据
for (int i = 0; i < baclist.size(); i ++) { 
            BasicDBObject obj = (BasicDBObject)baclist.get(i); 
            FSHP fs=new FSHP();
            //获取自己所需要的字段
            fs.setCS( (double) obj.get("cs"));
            fs.setGZCS( (double) obj.get("gzcs"));
            flist3.add(fs);



(这种方法普遍使用在分组的情况下,对于一些不分组的情况还不太清楚是怎么处理的)



猜你喜欢

转载自blog.csdn.net/LiMing_0820/article/details/78657146