为什么写这篇文章呢,是因为第一次接触mongoTemplate踩雷甚多之前问题都有csdn大神一一解决唯独spring整合mongoTemplate分组雷区众多,如果你是初学者那么恭喜,你来对了!
避免踩雷方向
下方贴出jar包版本
- 保证spring版本与mongodb驱动版本无冲突
- mongodb驱动3.2版本以上与spring mongoTemplate分组有冲突
<!-- spring机制版本号-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring版本号 -->
<spring.version>4.3.16.RELEASE</spring.version>
</properties>
<!-- mongodbjar包版本-->
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.14.2</version>
</dependency>
我这边是一个用户浏览量日志代码块一一贴出
分组机制
@Document(collection="ssm_demo")
public class Log {
private String id;//自增
private Integer userId;
private String userName;//名称
private String className;//类名
private String method;//方法名
private String reqParam;//发送参数
private String respParam;//返回参数
private Date createTime;//创建时间
private String ip;//请求ip
private String url;//请求路径
条查分页之类的都已一一解决唯独分组学习资料甚少雷区甚多
//分组查询各个用户请求次数
@RequestMapping("queryCountByUserName")
@ResponseBody
public Map<String,Object> queryCountByUserName(){
Map<String,Object> logMap = new HashMap<String,Object>();
Aggregation agg = null;
GroupOperation groupOperation = Aggregation.group("userName").count().as("count");
agg = Aggregation.newAggregation(Log.class, groupOperation);
AggregationResults<Map> aggregate = mongoTemplate.aggregate(agg,Log.class,Map.class);
List<Object> list = new ArrayList<>();
List<Object> list2 = new ArrayList<>();
for (Map map : aggregate) {
list.add(map.get("_id"));
list2.add(map.get("count"));
}
for (Object object : list) {
System.out.println(object);
}
logMap.put("container", list);
logMap.put("data", list2);
return logMap;
}
我这边是通过log日志中的username分组查询分组后各个数量,
希望这篇文章能帮到你们,少踩雷区。
加入条件查询
获取mongodb服务器中30天内的分组查询信息
首先我们先获取到30天前/后的日期
//当前时间
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
// 将当前时间减30就是一月前,一月后写30即可
cal.add(java.util.Calendar.DAY_OF_MONTH, -30);
//cal.getTime();//一个月前的时间
mongodb时间格式不是系统时间,用is比较会有不必要的bug如需某天数据要先转换时间格式mongodb时间格式转换即详解
Map<String,Object> logMap = new HashMap<String,Object>();
Aggregation aggregation4 =
Aggregation.newAggregation(
Aggregation.match(Criteria.where("createTime").lte(now)),
Aggregation.match(Criteria.where("createTime").gte(cal.getTime())),
Aggregation.group("userName").count().as("count"));
AggregationResults<Map> aggregate =
//log为你的实体类,map为接受方式
mongoTemplate.aggregate(aggregation4, Log.class,Map.class);
for (Map map : aggregate) {
//_id count 为返回值的名称
list.add(map.get("_id"));
list2.add(map.get("count"));
}
//放入list中就又可以进行其他操作了