spring框架 mongodb mongoTemplate实现分组 函数 时间条查适用初学者避免雷区

为什么写这篇文章呢,是因为第一次接触mongoTemplate踩雷甚多之前问题都有csdn大神一一解决唯独spring整合mongoTemplate分组雷区众多,如果你是初学者那么恭喜,你来对了!
避免踩雷方向
下方贴出jar包版本

  1. 保证spring版本与mongodb驱动版本无冲突
  2. 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中就又可以进行其他操作了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值