MongoTemplate 实现多条件、模糊查询、排序、范围、分页查询
首先说一下我这边的应用场景根据名称(模糊查询)、时间段、状态 来查询好多人都是用skip limit 来做分页,但我感觉数据量很大的时候 skip掉前面很多数据时,会有性能问题。所以我选择了使用Pageable 这个类来实现分页,注意一点 mongodb的第一页 pageNum 是从0开始的。所以要-1Pageable pageable = new PageRequest(pageNum,page
·
首先说一下我这边的应用场景
根据名称(模糊查询)、时间段、状态 来查询
好多人都是用skip limit 来做分页,但我感觉数据量很大的时候 skip掉前面很多数据时,会有性能问题。
所以我选择了使用Pageable 这个类来实现分页,注意一点 mongodb的第一页 pageNum 是从0开始的。所以要-1
Pageable pageable = new PageRequest(pageNum,pageSize);
还有个需求是按着创建时间倒叙展示,就是最后创建的在前面,所以用到了排序
//创建排序规则
Sort sort = new Sort(Sort.Direction.DESC, "cTime");
然后我们创建查询对象,并将分页对象和排序对象加入到查询对象上。
Query query = new Query();
query.with(pageable);
query.with(sort);
再加入名字查询条件 分精确查询和模糊查询,看自己需求就行
//如果name精确查询
if(!StringUtils.isEmpty(name)){
query.addCriteria(
Criteria.where("name").is(name)
);
}
下面为模糊查询
//如果name使用模糊查询则 创建正则
Pattern pattern= Pattern.compile("^.*"+name+".*$", Pattern.CASE_INSENSITIVE);
if(!StringUtils.isEmpty(name)){
query.addCriteria(
new Criteria().and("name").regex(pattern)
);
}
增加时间段查询,我这里为创建时间cTime,get >= , lte <=
if(!StringUtils.isEmpty(stime)){
query.addCriteria(
new Criteria().andOperator(
Criteria.where("cTime").gte(stime),
Criteria.where("cTime").lte(etime)
)
);
}
增加状态查询
if(!StringUtils.isEmpty(status) && !"0".equals(status)){
query.addCriteria(
Criteria.where("status").is(Integer.parseInt(status))
);
}
创建完条件之后,调用find查询
GoodsModel 是一个商品bean类
List<GoodsModel> list = mongoTemplate.find(query,GoodsModel.class);
//查询总数
Long count = mongoTemplate.count(query,GoodsModel.class);
完整代码
/**
* 查询商品列表
* @param name
* @param status
* @param stime
* @param etime
* @param pageNum
* @param pageSize
* @return
* @throws Exception
*/
@GetMapping(value = "/getGoodsListnew")
public RespData getGoodsNew(@RequestParam(required = false) String name,
@RequestParam(required = false) String status,
@RequestParam(required = false) String stime,
@RequestParam(required = false) String etime,
@RequestParam(required = true,defaultValue = "1") int pageNum,
@RequestParam(required = true,defaultValue = "10") int pageSize) throws Exception{
RespData respData = new RespData(RespCode.SUCCESS);
int pageNumnew =pageNum-1;
if(pageNumnew<0){
pageNumnew = 0;
}
System.out.println("pageNum"+pageNum);
//创建分页
Pageable pageable = new PageRequest(pageNumnew,pageSize);
//创建排序规则
Sort sort = new Sort(Sort.Direction.DESC, "cTime");
//创建查询对象
Query query = new Query();
query.with(pageable);
query.with(sort);
// 如果name精确查询
// if(!StringUtils.isEmpty(name)){
// query.addCriteria(
// Criteria.where("name").is(name)
// );
// }
//如果name使用模糊查询则 创建正则
Pattern pattern= Pattern.compile("^.*"+name+".*$", Pattern.CASE_INSENSITIVE);
if(!StringUtils.isEmpty(name)){
query.addCriteria(
new Criteria().and("name").regex(pattern)
);
}
//根据状态查询
if(!StringUtils.isEmpty(status) && !"0".equals(status)){
query.addCriteria(
Criteria.where("status").is(Integer.parseInt(status))
);
}
//根据创建时间查询
if(!StringUtils.isEmpty(stime)){
query.addCriteria(
new Criteria().andOperator(
Criteria.where("cTime").gte(stime),
Criteria.where("cTime").lte(etime)
)
);
}
List<GoodsModel> list = mongoTemplate.find(query,GoodsModel.class);
//查询总数
Long count = mongoTemplate.count(query,GoodsModel.class);
respData.setData(list);
respData.setTotal(count);
System.out.println("count"+count);
return respData;
}
数据库设计
GoodsModel类
package com.model;
import com.sun.istack.internal.Nullable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @Auther: Xu
* @Date: 2021/4/1 - 04 - 01 - 19:10
* @Description: com.model
* @version: 1.0
*/
@Data
@Document(collection = "goodsList")
public class GoodsModel {
@Id
private String _id;
private String name;
private String goodsDesc;
private String cTime;
private int price;
private int classType;
private int hotFlag;
private int status;
private int disCount;
}
最终效果
更多推荐
已为社区贡献2条内容
所有评论(0)