mongoTemplate Aggregation

可以通过以下声明方式进行使用

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);
        
好的,如果你正在使用MongoDB数据库,并且是通过Spring Data MongoDB中的MongoTemplate进行操作的话,那么可以使用Aggregation.group()方法对数据进行分组聚合操作。 Aggregation.group()方法接受一个或多个字段作为参数,并将这些字段作为分组依据。例如,如果你想按照某个字段进行分组,可以这样写: ``` Aggregation.group("fieldName"); ``` 如果你想对某个字段进行特殊处理,可以使用Aggregation操作符,例如: 1. $sum:求和 ``` Aggregation.group("fieldName").sum("otherFieldName").as("total"); ``` 这个操作会对"otherFieldName"字段进行求和,并将结果保存在名为"total"的新字段中。 2. $avg:求平均值 ``` Aggregation.group("fieldName").avg("otherFieldName").as("average"); ``` 这个操作会对"otherFieldName"字段进行求平均值,并将结果保存在名为"average"的新字段中。 3. $max:求最大值 ``` Aggregation.group("fieldName").max("otherFieldName").as("maxValue"); ``` 这个操作会对"otherFieldName"字段进行求最大值,并将结果保存在名为"maxValue"的新字段中。 4. $min:求最小值 ``` Aggregation.group("fieldName").min("otherFieldName").as("minValue"); ``` 这个操作会对"otherFieldName"字段进行求最小值,并将结果保存在名为"minValue"的新字段中。 5. $push:将某个字段的值放入一个数组中 ``` Aggregation.group("fieldName").push("otherFieldName").as("fieldValues"); ``` 这个操作会将"otherFieldName"字段的值放入一个名为"fieldValues"的数组中。 6. $addToSet:将某个字段的值放入一个集合中 ``` Aggregation.group("fieldName").addToSet("otherFieldName").as("fieldValues"); ``` 这个操作会将"otherFieldName"字段的值放入一个名为"fieldValues"的集合中。 除了上述操作符之外,还有很多其他的操作符可以使用。你可以根据自己的需求进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值