最近,做项目用到了mongodb数据库,在后台代码里面通过Spring集成MongoTemplate模板进行查询。
有时候常用的查询,已经不满足业务的需求,那么我们就通过聚合来进行查询。
//代码1:查询某个时间段内,并且id = 3的所有数据
//创建聚合查询模板 begin:开始时间 end:结束时间
Aggregation aggregation = aggregation = Aggregation.newAggregation( Aggregation.match(Criteria.where("datetime").gt(begin).lte(end).andOperator(Criteria.where("id").is(3)))
);
//聚合查询的结果集 StatisticsReport 是mongo表对应的实体类
AggregationResults<StatisticsReport> results = mongoTemplate.aggregate(aggregation, "你的monoddb的表名",StatisticsReport.class);
//获取最终结果
List<StatisticsReport> list = results.getMappedResults();
//代码2:分组查询 按name分组,str是个数组说明能进行多条件分组
//例如:按name,age分组,String str [] ={"name","age"};
String str [] = {"name"};
Fields groupFields = Fields.fields(str );
//创建分组条件
GroupOperation groupOperation = new GroupOperation(groupFields ).count().as("name").last("name").as("name").count().as("datetime").last("datetime").as("datetime").sum("click").as(click).sum("cost").as("cost");
/*count().as("name").last("name").as("name")是分组后,显示的name结果,datetime同理,sum("click").as(click)是求出click的总数,并显示click累加结果,cost同理*/
//和代码1的集成起来 查询某个时间段内,并且id = 3,然后通过name分组,最后通过datetime排序(可有可无)
Aggregation aggregation = aggregation = Aggregation.newAggregation( Aggregation.match(Criteria.where("datetime").gt(begin).lte(end).andOperator(Criteria.where("id").is(3))),
groupOperation,
new SortOperation(new Sort(Sort.Direction.ASC, "datetime"));
AggregationResults<StatisticsReport> results = mongoTemplate.aggregate(aggregation, "你的monoddb的表名",StatisticsReport.class);
List<StatisticsReport> list = results.getMappedResults();
以上,查询基本满足了复杂的统计查询。至于模糊查询和分页就不细说了。