• mongodb分页Spring-data-mongodb


    jar包引入

    <!--在引入spring-boot-parent的前提下加入下面一段即可添加mongodb依赖-->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    

    实体类配置

    • @Document 标识这是一个mongodb类
    • spring会创建一个为Log的集合 并且和类具有相同的属性
    • @Id 标示了集合主键,当插入时会自动生成主键值放到id里
    • @CompoundIndexes 用来定义一组集合索引
    • @CompoundIndex 用来定义一条索引
    @Document(collection = "Log")
    @CompoundIndexes({
            @CompoundIndex(name = "id_1",def = "{'id':1}"),
            @CompoundIndex(name = "logName_-1_id_-1",def = "{'logName':-1,'id':-1}")
    })
    public class Log {
    
        @Id
        private String id;
    
        private String logName;
    
    	//别忘了get,set方法
    }
    

    建立索引的一点经验

    • 复合索引 a-b-c 顺序不是乱放的,b-a-c 就是完全不同的另外一个索引了

    • a-b-c 如果查询条件a为空,那么查询的时候不会使用以a开头的索引,包括a-b,a-b-c,a-c-b

    • 如果有了索引a-b那么就不需要建立a字段的索引了

    • a-b-c索引,a字段里的数据不能是唯一数据(不重复)
      设想一下,查询时要为a字段传入查询条件,否则不会使用 a-b-c索引,
      但是你一旦为a字段传入查询条件,就唯一限定了一条数据,后面两个条件还有意义吗?所以复合索引第一个字段里的数据应该是重复的

    application.yml配置文件

    详情参考http://www.runoob.com/mongodb/mongodb-connections.html

    spring:
      data:
        mongodb:
          uri: mongodb://log:log@192.168.0.100:27017/log
    

    查询

    @Autowired
    private MongoTemplate mongoTemplate;
    	
    public Page<Log> findList(LogParam logParam) {
    		List<Criteria> listCriteria = new ArrayList<>();   //存储要拼接的查询条件
    		Sort sort = new Sort(Sort.Direction.DESC, "id");   //设置排序字段
    
    		//使用is 精确匹配,和=一样 
    		listCriteria.add(Criteria.where("logCategory").is(logParam.getLogCategory()));
    
    		//使用regex 模糊查询
    		listCriteria.add(Criteria.where("logNum").regex(logParam.getLogNum()));
    
    		//处理时间 gte大于等于 lte小于等于
    		//因为我们createTime存的时间戳,我在这里要转换一下
    		//否则可以直接传入这个格式的时间(yyyy-MM-dd HH:mm:ss)
    		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		try {
    			Date date = dateFormat.parse(logParam.getMinTime());
    			listCriteria.add(Criteria.where("createTime").gte(date.getTime()));
    			listCriteria.add(Criteria.where("createTime").lte(System.currentTimeMillis());
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    
    		Criteria[] criterias = new Criteria[listCriteria.size()];  //创建和集合等长的数组
    		listCriteria.toArray(criterias);  //将集合数据存到数组
    
    		//Query 是查询条件  注意怎么处理的
    		//with:后面跟排序字段
    		//skip:从第几条数据开始
    		//limit:一次取出多少条数据
    		//andOperator:所有的条件是and关系 如果想用or关系 可以使用orOperator 另外还有norOperator
    		//当然如果你只有一个条件 完全可以这样写 query = new Query(Criteria.where("logNum").regex(logParam.getLogNum()))
    		Query query = null;
    		if(0 == criterias.length){
    			query = new Query().with(sort).skip(logParam.get("pageNo")).limit(logParam.get("pageSize"));
    		}else {
    			query = new Query(new Criteria().andOperator(criterias)).with(sort).skip(logParam.get("pageNo")).limit(logParam.get("pageSize"));
    		}
    
    		page.setTotal(mongoTemplate.count(query, Log.class));  //count 查询返回的数据数量
    		page.setRecords(mongoTemplate.find(query, Log.class));  //find 这才是真正的查询方法
            return page;
    	}
    
  • 相关阅读:
    linux--->PHP常用模块解析
    php--->php 缓冲区 buffer 原理
    php--->php打印格式化
    mysql--->MySQL错误日志
    mysql--->mysql慢查询
    单双引号问题
    博客园图片显示问题
    laravel 常用知识总结
    laravel config文件的使用
    laravel 接收json串
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284750.html
Copyright © 2020-2023  润新知