您的位置:首页 > 数据库 > Mongodb

MongoDB 中聚合查询中 用BasicBDObject拼接条件的方法

2018-11-09 19:14 549 查看

MongoDB 中聚合查询中 用BasicBDObject拼接条件的方法
把拼接的查询条件放到 collection.aggregate()方法中 返回的是一个List类型

public Page<DBObject> findGroupByExecuteFunctions(ServiceExceptionParamModel queryParam) {

System.out.println("queryParam.getStartTime()=>"+queryParam.getStartTime());
System.out.println("queryParam.getEndTime()=>"+queryParam.getEndTime());
DBCollection collection = mongoTemplate.getCollection(COLLECTION_NUM );
if(StringUtils.isNotBlank(queryParam.getStartTime()))
{
String [] time=queryParam.getStartTime().split("\\s");
System.out.println("time[0]"+time[0]);
queryParam.setEndTime(time[0]+" 23:59:59");
}
System.out.println("queryParam.getEndTime()=>"+queryParam.getEndTime());
//统计符合条件的条数
AggregationOutput pageCount=collection.aggregate(getBrowseCountAggregate(  false,queryParam));
List<DBObject> resultsPage=(List<DBObject>) pageCount.results(); ;
long totalCount= resultsPage.size();
//System.out.println("totalCount==>"+totalCount);
queryParam.pageable().setTotalCount(totalCount);

Integer functionCount=0;
for(DBObject db: resultsPage){
functionCount+=(Integer)db.get("count");
}
System.out.println( "所选时间内所有方法出现次数"+functionCount);

//查出符合条件得当前页记录
AggregationOutput allagregate=collection.aggregate(getBrowseCountAggregate( true,queryParam));
List<DBObject> results=(List<DBObject>) allagregate.results() ;
//System.out.println(results);
//long totalCount =results.size();
for(DBObject db:results){
System.out.println(db.get("_id")+"=>"+db.get("count"));
}
return new PageImpl<DBObject>(results,queryParam.pageable(),queryParam.totalCount());
}
private List<DBObject>  getBrowseCountAggregate( boolean isPage,ServiceExceptionParamModel queryParam){

List<DBObject> aggregateList =new ArrayList<DBObject>();
/*Date today=DateUtil.getTodayBegin();//今天的 00:00:00
Date  yesterDay =DateUtil.getTodayBegin();//昨天的 00:00:00
*/		Date today=DateUtil.getTodayBegin();//今天的 00:00:00
Date  yesterDay =DateUtil.getYesterDay(DateUtil.getTodayBegin());//昨天的 00:00:00
DBObject skip;
DBObject limit;
System.out.println("today"+today);
System.out.println("yesterDay"+yesterDay);

//选取时间范围
if(StringUtils.isNotBlank(queryParam.getStartTime())){
BasicDBObject optionmatch=new BasicDBObject(
"_id",new BasicDBObject(
"$gt", new  ObjectId(DateUtil.formateToDate(queryParam.getStartTime())))
.append("$lte", new ObjectId(DateUtil.formateToDate(queryParam.getEndTime())))
);
//选取指定的方法
if(StringUtils.isNotBlank(queryParam.getExecuteFunction())){
optionmatch.put("ExecuteFunction", queryParam.getExecuteFunction());
}
//选取指定的类
if(StringUtils.isNotBlank(queryParam.getExecuteClass())){
optionmatch.put("ExecuteClass", queryParam.getExecuteClass());
}
//添加筛选条件 $match 是筛选条件
BasicDBObject match=new  BasicDBObject("$match",optionmatch);
aggregateList.add(match);
}else{
System.out.println("today=>"+new  ObjectId(today));
System.out.println("yesterDay=>"+new  ObjectId(yesterDay));
BasicDBObject optionmatch=new BasicDBObject(
"_id",new BasicDBObject(
"$gt", new  ObjectId(yesterDay)).
append("$lte", new ObjectId(today))
);

//选取指定的方法
if(StringUtils.isNotBlank(queryParam.getExecuteFunction())){
optionmatch.put("ExecuteFunction", queryParam.getExecuteFunction());
}
//选取指定的方法
if(StringUtils.isNotBlank(queryParam.getExecuteClass())){
optionmatch.put("ExecuteClass", queryParam.getExecuteClass());
}
//添加筛选条件
BasicDBObject match=new  BasicDBObject("$match",optionmatch);
aggregateList.add(match);
}

// DBObject fields = new BasicDBObject("_id", 1);
// fields.put("count", 1);
// DBObject project = new BasicDBObject("$project", fields);

//BasicDBObject optionGroup =new BasicDBObject("_id","$ExecuteFunction").append("count",new BasicDBObject("$sum",1) );
//添加 分组聚合条件
BasicDBObject optionGroup =new BasicDBObject(
"_id",new BasicDBObject(
"ExecuteClass","$ExecuteClass")
.append("ExecuteFunction","$ExecuteFunction")

);
optionGroup.put("count", new BasicDBObject("$sum",1));
optionGroup.put("duration", new BasicDBObject("$avg","$duration"));
optionGroup.put("durationMax", new BasicDBObject("$max","$duration"));
//拼分组聚合条件
BasicDBObject group =new BasicDBObject("$group",optionGroup);

//排序选择器
DBObject sort=null;

//按数量排序 如果 有其他排序条件则该条件被覆盖
if(StringUtils.isNotBlank(queryParam.getCountSort() )){
System.out.println("queryParam.getCountSort().toUpperCase()"+queryParam.getCountSort().toUpperCase());
if("ASC".equals(queryParam.getCountSort().toUpperCase())){

sort = new BasicDBObject("$sort", new BasicDBObject( "count", 1));
}else{
sort = new BasicDBObject("$sort", new BasicDBObject( "count", -1));
}
}

//拼接持续时间
if(StringUtils.isNotBlank(queryParam.getDurationSort())){

if("ASC".equals(queryParam.getDurationSort().toUpperCase())){
sort = new BasicDBObject("$sort", new BasicDBObject( "duration", 1));
}else{
sort = new BasicDBObject("$sort", new BasicDBObject( "duration", -1));
}

}

//拼接 最大持续时间条件
if(StringUtils.isNotBlank(queryParam.getDurationMaxSort())){
if("ASC".equals(queryParam.getDurationMaxSort().toUpperCase())){
sort = new BasicDBObject("$sort", new BasicDBObject( "durationMax", 1));
}else{
sort = new BasicDBObject("$sort", new BasicDBObject( "durationMax", -1));
}

}

aggregateList.add(group);
if(sort==null){
if("asc".equals(queryParam.getCountSort())){
sort = new BasicDBObject("$sort", new BasicDBObject( "count", 1));
}else{
sort = new BasicDBObject("$sort", new BasicDBObject( "count", -1));
}
}
aggregateList.add(sort);
//aggregateList.add(project);
//isPage=false 是 统计总共的条数
if(isPage){
skip = new BasicDBObject("$skip", (queryParam.getPage())*queryParam.getSize());
limit = new BasicDBObject("$limit", queryParam.getSize());
aggregateList.add(skip);
aggregateList.add(limit);
}

return aggregateList;
}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: