首先说一下我这边的应用场景

根据名称(模糊查询)、时间段、状态 来查询

好多人都是用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;
}

最终效果

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐