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;
}