第一种方法:用DB对象创建查询条件,mongoTemplate调用
@Override
public Map<String, Object> getGoodsByCondition(int pageNumber, int pageSize, String title, String country, String sortType, String startDate, String endDate) {
PageRequest pageRequest = super.getPageRequest(pageNumber, pageSize, sortType);
List<Goods> list;
Long total;
if (StringUtils.isEmpty(title) && StringUtils.isEmpty(country) && StringUtils.isEmpty(startDate) && StringUtils.isEmpty(endDate)) {
list = this.getForPageList(pageNumber, pageSize, sortType);
total = goodsRepos.count();//总数
} else {
BasicDBList basicDBList = new BasicDBList();
if (StringUtils.isNotEmpty(title)) {
//模糊查询
Pattern pattern = Pattern.compile("^.*" + title + ".*$", Pattern.CASE_INSENSITIVE);
basicDBList.add(new BasicDBObject("name", pattern));
}
if (StringUtils.isNotEmpty(country)) {//等值查询
basicDBList.add(new BasicDBObject("country", country));
}
if (StringUtils.isNotEmpty(startDate)) {//大于等于
basicDBList.add(new BasicDBObject("insert_date", new BasicDBObject("$gte", startDate)));
}
if (StringUtils.isNotEmpty(endDate)) {//小于等于
basicDBList.add(new BasicDBObject("insert_date", new BasicDBObject("$lte", endDate)));
}
DBObject obj = new BasicDBObject();
obj.put("$and", basicDBList);//拼接条件
Query query = new BasicQuery(obj);
list = mongoTemplate.find(query.with(pageRequest), Goods.class);//结果集
total = mongoTemplate.count(query.with(pageRequest), Goods.class);//总数
}
Map resultMap = new HashMap();
resultMap.put("list", list);
resultMap.put("total", total);
return resultMap;
}
@Override
public PageRequest getPageRequest(int pageNumber, int pageSize, String sortType) {
//处理排序
Sort sort;
if (sortType == null || "".equals(sortType)) {
sort = new Sort(Sort.Direction.DESC, "insertDate");
} else {
sort = new Sort(Sort.Direction.DESC, sortType);
}
return new PageRequest(pageNumber-1, pageSize, sort);
}
第二种方法:用Query和Criteria对象创建查询条件,mongoTemplate调用
int pageNo = condition.getPageNo();
int pageSize = condition.getPageSize();
// 创建查询对象
Query query = new Query();
Criteria criteria = new Criteria();
// 等值查询
if (StringUtils.isNotBlank(condition.getAccount())) {
criteria.and("liveId").is(condition.getLiveId());
}
// 模糊查询
if (StringUtils.isNotBlank(condition.getName())) {
Pattern pattern = Pattern.compile("^.*" + condition.getName()
+ ".*$", Pattern.CASE_INSENSITIVE);
criteria.and("name").regex(pattern);
}
if (null != condition.getStartTime() && null != condition.getEndTime()) {
criteria.and("time").gte(condition.getStartTime()).lte(condition.getEndTime());
} else if (null != condition.getStartTime()) {
//开始时间
criteria.and("time").gte(condition.getStartTime());
} else if (null != condition.getEndTime()) {
//结束时间
criteria.and("time").lte(condition.getEndTime());
}
query.addCriteria(criteria);
query.with(new Sort(Sort.Direction.DESC, "time"));
// 设置起始数
query.skip((pageNo - 1) * pageSize);
// 设置查询条数
query.limit(pageSize);
List<Test> list = mongoTemplate.find(query, Test.class);
第三种方式:继承MongoRepository,方法名用条件的表达式的方式命名(适合条件简单一些的)
public interface GoodsRepos extends MongoRepository<Goods, String> {
Goods getByGoodsId(String goodsId);
Page<Goods> getByNameLikeAndCity(String name,String country, Pageable pageable);
Long countByNameLike(String name);
}
相关文档:https://docs.spring.io/spring-data/mongodb/docs/2.1.2.RELEASE/reference/html/#mongodb-template-query