mongoDB 直接執行語句 分組聚合統計
阿新 • • 發佈:2021-01-07
由於一個複雜的聚合語句,花了一些時間沒調試出合適的java api程式碼,所以想辦法直接執行語句,條件直接用字串拼接。
簡單示例
String command= "";
BasicDBObject bson = new BasicDBObject();
bson.put("$eval",command.toString());
Document result = mongoTemplate.getDb().runCommand(bson);
一個聚合案例
StringBuilder matchStr = new StringBuilder("db.getCollection('表名').aggregate([{$match:{validFlag:'1'");// }}, String aggrType = ""; //dto為一個引數物件 if (dto.getStartTime() != null && dto.getEndTime() != null) { matchStr.append(",inHosTime:{$gte:"+dto.getStartTime()+"}"); matchStr.append(",inHosTime:{$lte:"+dto.getEndTime()+"}"); } //聚合條件及引數設定 if (StrUtil.isEmpty(dto.getHosId())&&CollectionUtil.isEmpty(dto.getDiseaseAreaNames())){ aggrType="hospitalId"; } if (StrUtil.isNotEmpty(dto.getHosId())){ matchStr.append(",hospitalId:'"+dto.getHosId()+"'"); aggrType="diseaseAreaName"; } if (CollectionUtil.isNotEmpty(dto.getDiseaseAreaNames())){ matchStr.append(",diseaseAreaName:{'$in':"+JSONUtil.toJsonStr(dto.getDiseaseAreaNames())+"}"); aggrType="diseaseAreaName"; } matchStr.append("}},"); StringBuilder projectStr1 = new StringBuilder("{$project:{_id:'$"+aggrType+"',InHosNum:{$cond:[{$eq:['$status','是']},1,0]},OutHosNum:{$cond:[{$eq:['$status','否']},1,0]}}},"); StringBuilder bStr = matchStr.append(projectStr1) .append("{$group:{_id:'$_id',totalInHosNum:{$sum:'$InHosNum'},totalOutHosNum:{$sum:'$OutHosNum'},}},") .append("{$project:{_id:0," +aggrType+":'$_id',totalInHosNum:1,totalOutHosNum:1}}])"); BasicDBObject bson = new BasicDBObject(); bson.put("$eval",bStr.toString()); Document result = mongoTemplate.getDb().runCommand(bson); //結果轉換 List<InAndOutHosResponseDTO> list = JSONUtil.toList(JSONUtil.parseArray(result.get("retval",Document.class).get("_batch")),InAndOutHosResponseDTO.class); System.out.println(JSONUtil.toJsonStr(result.get("retval",Document.class).get("_batch")));
程式碼中的語句
db.getCollection('表').aggregate([ //匹配條件 {$match:{validFlag:'1'}}, //統計前資料處理 把原始資料處理後統計 令_id值為統計維度醫院id, status為'是' InHosNum=1,OutHosNum=0 status為'否' InHosNum=0 ,OutHosNum=1 {$project:{_id:'$hospitalId',InHosNum:{$cond:[{$eq:['$status','是']},1,0]},OutHosNum:{$cond:[{$eq:['$status','否']},1,0]}}}, //聚合語句 {$group:{_id:'$_id',totalInHosNum:{$sum:'$InHosNum'},totalOutHosNum:{$sum:'$OutHosNum'}}}, //聚合結果處理 能讓結果集更好的轉換為資料返回物件 {$project:{_id:0,hospitalId:'$_id',totalInHosNum:1,totalOutHosNum:1}}]);