springboot操作mongodb之Aggregation组装
废话不说直接和是哪个代码
原始mongodb语句
db.gpsData.aggregate(
[
{
"$match": {
"deviceSn": "213L20170003",
"gpsFlag": {
"$in": [
"2",
"3",
"10"
]
},
"lat": {
"$exists": true
},
"lng": {
"$exists": true
},
"collectDatetime": {
"$gte": {
"$date": "2020-04-13T17:00:00.000Z"
},
"$lte": {
"$date": "2020-04-13T18:00:00.000Z"
}
}
}
},
{
"$project": {
"lat": 1,
"lng": 1,
"speed": 1,
"direction": 1,
"steps": 1,
"calorie": 1,
"collect_datetime": {
"$dateToString": {
"format": "%Y-%m-%d %H:%M:%S",
"date": {
"$add": [
"$collectDatetime",
28800000
]
},
"timezone": "+08:00"
}
},
"device_sn": "$deviceSn",
"_id": 0
}
},
{
"$sort": {
"collect_datetime": 1
}
}
]
)
转化成java
/**
* @Description: 获取时间段内的GPS数据
* @Author: 范利瑞
* @CreateDate: 2020/4/17 15:51
*/
public List<HashMap> queryGpsOrderByTime(String deviceSn,
Integer timezone,
Date staUtcTime,
Date endUtcTime) {
timezone = timezone*1000;
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("deviceSn").is(deviceSn)
.and("gpsFlag").in("2","3","10")
.and("lat").exists(true)
.and("lng").exists(true)
.and("collectDatetime").gte(staUtcTime).lte(endUtcTime)
)
,project("lat","lng","speed","direction","steps","calorie")
.andExpression("{$dateToString:{format:'%Y-%m-%d %H:%M:%S',date: {$add:{'$collectDatetime',"+timezone+"}} , timezone: '+08:00'}}").as("collect_datetime")
.andExpression("deviceSn").as("device_sn")
.andExclude("_id")
,sort(Sort.Direction.ASC, "collect_datetime")
);
AggregationResults<HashMap> refreshTask = mongoTemplate.aggregate(aggregation, "gpsData", HashMap.class);
List<HashMap> mappedResults = refreshTask.getMappedResults();
return mappedResults;
}