zoukankan      html  css  js  c++  java
  • 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;
    	}
    
  • 相关阅读:
    257. Binary Tree Paths
    324. Wiggle Sort II
    315. Count of Smaller Numbers After Self
    350. Intersection of Two Arrays II
    295. Find Median from Data Stream
    289. Game of Life
    287. Find the Duplicate Number
    279. Perfect Squares
    384. Shuffle an Array
    E
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284750.html
Copyright © 2011-2022 走看看