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;
	}
posted @ 2018-08-02 18:23  慢慢行  阅读(70)  评论(0编辑  收藏  举报