MongoTemplate聚合查詢

1、統計缺失站點數量及信息,按數量倒序排列

表結構

{
    "datetime" : "20200101000000",
    "missid" : [ 
        "54748", 
        "54859", 
        "54946"
    ],.....
}
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;


/*
 * project:列出所有本次查詢的字段,包括查詢條件的字段和需要搜索的字段;
 * match:搜索條件criteria
 * unwind:某一個字段是集合,將該字段分解成數組
 * group:分組的字段,以及聚合相關查詢
 *      sum:求和(同sql查詢) group("type").sum("size").as("total")
 *      count:數量(同sql查詢) group("missid").count().as("count")
 *      as:別名(同sql查詢)
 *      addToSet:將符合的字段值添加到一個集合或數組中
 * sort:排序
 * skip&limit:分頁查詢
 */
	public String getLostStationSumByTimeRange(String timeRange) {
		String[] times = timeRange.split(",");
		Criteria criteria = Criteria.where("datetime").gte(times[0]).lte(times[1]);
		Aggregation aggregation = Aggregation.newAggregation(match(criteria), project("missid"),
				Aggregation.unwind("missid"), group("missid").count().as("count"),
				project("count").and("missid").previousOperation(), Aggregation.sort(Sort.Direction.DESC, "count"));
		AggregationResults<SubjectCount> ar = mongoTemplate.aggregate(aggregation, "XXLog",
				SubjectCount.class);
		List<SubjectCount> lists = ar.getMappedResults();
		for(SubjectCount sub : lists) {
			Station s = mongoTemplate.findOne(new Query(Criteria.where("stationid").is(Integer.parseInt(sub.getMissid()))), Station.class,"station");
			if(s!=null) {
			sub.setName(s.getName());
			sub.setArea(s.getArea());
			sub.setCity(s.getCity());
			}
		}
		return new Gson().toJson(lists);
	}

查詢結果

[
{
"missid": "54659",
"count": 25,
"name": "xx",
"city": "xx",
"area": "xx"
},
{
"missid": "54862",
"count": 25,
"name": "xx",
"city": "xx",
"area": "xx"
}....]

2、統計某段時間內訪問API的最新時間

public Object getAPINameByTimeRange(String timeRange) {
		String[] times = timeRange.split(",");
		Criteria criteria = Criteria.where("accesstime").gte(times[0]).lte(times[1]);
		Aggregation aggregation = Aggregation.newAggregation(match(criteria), 
				sort(Sort.Direction.DESC, "accesstime"), //倒序
				group("apiname").first("accesstime").as("accesstime"), //按api名字分組,取第一個時間
				project("apiname", "accesstime").and("apiname").previousOperation());
		AggregationResults<APIMonitor> ar = mongoTemplate.aggregate(aggregation, "monitor", APIMonitor.class);
		List<APIMonitor> list = ar.getMappedResults();
		
	}

3、按天統計

MongoDB3.4
public Object getAPIByDay(String timeRange) {
		String[] times = timeRange.split(",");
		Criteria criteria = Criteria.where("accesstime").gte(times[0]).lte(times[1]);
		Aggregation aggregation = Aggregation.newAggregation(match(criteria),
				project("day").andExpression("substr(accesstime,0,8)").as("time"), //轉換格式
				group("day", "time").count().as("total"), 
				sort(Sort.Direction.DESC, "time"));
		AggregationResults<APIMonitor> ar = mongoTemplate.aggregate(aggregation, "Monitor", APIMonitor.class);
		List<APIMonitor> list = ar.getMappedResults();
	}
	或者MongoDB3.6及以上
	Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.project(""inDate")
                        .andExpression("{$dateToString:{format:'%Y年%m月%d日',date:'$inDate',timezone: 'Asia/Shanghai'}}").as("dateToString")
        );

結果

[{
"total": 1933,
"time": "20200526"
},
{
"total": 27550,
"time": "20200525"
}]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章