1. 程式人生 > 其它 >mongoDB 直接執行語句 分組聚合統計

mongoDB 直接執行語句 分組聚合統計

技術標籤:mongoDBmongodb

由於一個複雜的聚合語句,花了一些時間沒調試出合適的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}}]);