可以通过以下声明方式进行使用
TypedAggregation<User> agg = Aggregation.newAggregation(User.class);
AggregationResults<BasicDBObject> aggregationResults = mongoTemplate.aggregate
(agg, BasicDBObject.class); //BasicDBObject可以替换成对应的model类
Aggregation agg = Aggregation.newAggregation(User.class);
AggregationResults<BasicDBObject> aggregationResults = mongoTemplate.aggregate
(agg, User.class, BasicDBObject.class);
示例:
Aggregation.newAggregation(User.class,
match(criteria),
group("id", "infoList"), // { "$group" : { "_id" : { "id" : "$id" , "infoList" : "$infoList"}}}
unwind("infoList"), //{ "$unwind" :"$_id.infoList"}
project("id", "infoList"), // { "$project" : { "id" : "$_id.id", "infoList" : "$_id.infoList"}}
group("infoList.date").addToSet(
"infoList.timeSlot").as("timeSlots"),
project("timeSlots").and("time")
.previousOperation()
);
//其他: 如果先使用group 再用project时
/*
group("id", "infoList"),
unwind("infoList"),
project("id").and("infoList")
.previousOperation()
.andInclude("infoList") // {"$project" : { "id" : "$_id.id" , "_id" : 0 , "infoList" : "$_id.infoList"}}
*/
/*
project("id").and("infoList")
.previousOperation()
.andInclude("infoList", "id")
//.previousOperation()表示使用"infoList": "$_id",
此时 "_id" : 0,
继续使用.andInclude("infoList", "id")则表示
"infoList" : "$_id.infoList", "id": "$_id.id";
如果and(name) name未被使用则会变成
name会单独作为key,且值为"$_id"
*/
示例2: 查询每分钟qps总量
public class Statistic {
private String id;
private String server;
private Long qps;
private Date createTime;
}
String createDateAttr = "createTime";
TypedAggregation<Statistic> agg = Aggregation.newAggregation(Statistic.class,
/** 筛选条件 **/
/** 2020-08-24 当天
{
"$match":{
"createDate":{
"$gte": ISODate("2020-08-23T16:00:00.000Z"),
"$lte": ISODate("2020-08-24T15:59:59.999Z")
}
}
}
**/
Aggregation.match(Criteria
.where(createDateAttr).gte(dateStart).lte(dateEnd)
)
/** 格式化字段 **/
/**
{
"$project":{
"server":1,
"createTime":1,
//别名
"value" : "$qps",
"minute":{
"$dateToString":{
"date":"$createTime",
"format":"%H:%M",
"timezone":"+08:00"
}
}
}
}
**/
, Aggregation.project("server", createDateAttr)
//别名
.and("qps").as("value")
//格式化时间
.andExpression("{ $dateToString: {date: '$" + createDateAttr + "', format: '%H:%M', timezone: '+08:00'}}").as("minute")
/** 按server取机器每分钟最大 **/
/**
{
"$group":{
"_id":{
"server":"$server",
"minute":"$minute"
},
"value":{
"$max":"$value"
}
}
}
**/
, Aggregation.group("server", "minute")
.max("value").as("value")
/** 格式化字段 **/
/**
{
"$project":{
"server":"$_id.server",
"minute":"$_id.minute",
"_id":0,
"value":1
}
}
**/
, Aggregation.project("server", "minute", "value")
//排除id字段
.andExclude("_id")
/** 汇总所有机器每分钟总量 **/
/**
{
"$group":{
"_id":"$minute",
"value":{
"$sum":"$value"
}
}
}
**/
, Aggregation.group("minute")
.sum("value").as("value")
/** 格式化字段 **/
/**
{
"$project":{
"value":1,
"_id":0,
"minute":"$_id"
}
}
**/
, Aggregation.project("value")
//.previousOperation()表示使用"minute": "$_id",
.and("minute").previousOperation()
);
AggregationResults<Map> result = mongoTemplate.aggregate(agg, Map.class);