mongodb 多条件分页查询的三种方法

今天药忘吃喽~ 2022-12-03 08:43 470阅读 0赞

转载自:https://javacfox.github.io/2019/06/09/mongodb%E5%A4%9A%E6%9D%A1%E4%BB%B6%E5%88%86%E9%A1%B5%E6%9F%A5%E8%AF%A2%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95/

叙述

介绍 MongoDB 带参数分页查询的具体实现方法

一、使用limit和skip进行分页查询

  1. public List<User> pageList(int pageNum ,int pageSize){
  2. List<User> userList = new ArrayList<>();
  3. Mongo mg = new Mongo();
  4. DB db = mg.getDB("data");
  5. DBCollection coll = db.getCollection("t_user");
  6. DBCursor limit = coll.find().skip((pageNum-1)*pageSize).sort(new BasicDBObject()).limit(pageSize);
  7. while (limit.hasNext()){
  8. userList.add(parse(new User(),limit.next()));
  9. }
  10. return userList;
  11. }
  12. private User parse(User user,DBObject obj){
  13. user.setAge((int) obj.get("age"));
  14. user.setName((String)obj.get("name"));
  15. user.setPwd((String)obj.get("pwd"));
  16. return user;
  17. }
  18. //查询结果 1,2
  19. [
  20. {
  21. "id": null,
  22. "name": "ljl",
  23. "pwd": "123456",
  24. "age": 24
  25. },
  26. {
  27. "id": null,
  28. "name": "lsr",
  29. "pwd": "123456",
  30. "age": 18
  31. }
  32. ]

通过skip和limit方法可以简单的实现分页操作,但是如果数据量特别巨大的时候,会出现性能的问题,建议不使用!

二、通过原生的方法实现条件查询、分页和排序

  1. public Page<User> getPageByOriginalFunction(int age,int pageNUmber,int pageSize){
  2. //查询条件,可以传递多个查询条件
  3. User user = new User();
  4. user.setAge(age);
  5. Example<User> example = Example.of(user);
  6. //分页条件
  7. //Pageable pageable = new PageRequest(pageNUmber,pageSize);
  8. Pageable pageable = PageRequest.of(pageNUmber,pageSize);
  9. return secondRepository.findAll(example,pageable);
  10. }
  11. //查询结果
  12. {
  13. "content": [
  14. {
  15. "id": "5cfb69ee4332ce07b864d12e",
  16. "name": "lsr",
  17. "pwd": "123456",
  18. "age": 18
  19. }
  20. ],
  21. "pageable": {
  22. "sort": {
  23. "sorted": false,
  24. "unsorted": true
  25. },
  26. "offset": 0,
  27. "pageSize": 2,
  28. "pageNumber": 0,
  29. "unpaged": false,
  30. "paged": true
  31. },
  32. "last": true,
  33. "totalPages": 1,
  34. "totalElements": 1,
  35. "number": 0,
  36. "size": 2,
  37. "sort": {
  38. "sorted": false,
  39. "unsorted": true
  40. },
  41. "first": true,
  42. "numberOfElements": 1
  43. }

三、通过实现Pageable接口,自定义

1.创建自定义分页类,实现Pageable接口

  1. import lombok.AllArgsConstructor;
  2. import lombok.NoArgsConstructor;
  3. import org.springframework.data.domain.Pageable;
  4. import org.springframework.data.domain.Sort;
  5. import javax.validation.constraints.Min;
  6. @NoArgsConstructor
  7. @AllArgsConstructor
  8. public class SpringDataPageAble implements Pageable {
  9. @Min(1)
  10. private Integer pageNumber = 1;
  11. @Min(1)
  12. private Integer pageSize = 10;
  13. private Sort sort;
  14. public void setSort(Sort sort) {
  15. this.sort = sort;
  16. }
  17. // 当前页面
  18. @Override
  19. public int getPageNumber() {
  20. return this.pageNumber;
  21. }
  22. // 每一页显示的条数
  23. @Override
  24. public int getPageSize() {
  25. return getPagesize();
  26. }
  27. // 第二页所需要增加的数量
  28. @Override
  29. public long getOffset() {
  30. return (getPageNumber() - 1) * getPagesize();
  31. }
  32. @Override
  33. public Sort getSort() {
  34. return sort;
  35. }
  36. public void setPagenumber(Integer pagenumber) {
  37. this.pageNumber = pageNumber;
  38. }
  39. public Integer getPagesize() {
  40. return this.pageSize;
  41. }
  42. public void setPagesize(Integer pagesize) {
  43. this.pageSize = pagesize;
  44. }
  45. @Override
  46. public Pageable next() {
  47. return null;
  48. }
  49. @Override
  50. public Pageable previousOrFirst() {
  51. return null;
  52. }
  53. @Override
  54. public Pageable first() {
  55. return null;
  56. }
  57. @Override
  58. public boolean hasPrevious() {
  59. return false;
  60. }
  61. }

2.在repository层定义分页方法

  1. import com.tedu.huawei.entity.User;
  2. import org.springframework.data.domain.Page;
  3. import org.springframework.data.domain.Pageable;
  4. import org.springframework.data.mongodb.repository.MongoRepository;
  5. public interface UserFirstRepository extends MongoRepository<User,String> {
  6. Page<User> getUserByAgeGreaterThan(int age, Pageable pageAble);
  7. }

3.service层调用方法

  1. public Page<User> getUserByAgeGraterThan(int age, int pageNumber,int pageSize){
  2. SpringDataPageAble springDataPageAble = new SpringDataPageAble(pageNumber,pageSize,new Sort(Sort.Direction.ASC,"age"));
  3. return firstRepository.getUserByAgeGreaterThan(age,springDataPageAble);
  4. }

查询结果显示

  1. {
  2. "content": [
  3. {
  4. "id": "5cfb66114332ce07b864d12d",
  5. "name": "lsr",
  6. "pwd": "123456",
  7. "age": 18
  8. },
  9. {
  10. "id": "5cfb85084332ce4ffca97907",
  11. "name": "panzi",
  12. "pwd": "654321",
  13. "age": 24
  14. }
  15. ],
  16. "pageable": {
  17. "pageNumber": 1,
  18. "pageSize": 2,
  19. "sort": {
  20. "sorted": true,
  21. "unsorted": false
  22. },
  23. "offset": 0,
  24. "pagesize": 2,
  25. "unpaged": false,
  26. "paged": true
  27. },
  28. "last": true,
  29. "totalPages": 1,
  30. "totalElements": 2,
  31. "number": 1,
  32. "size": 2,
  33. "sort": {
  34. "sorted": true,
  35. "unsorted": false
  36. },
  37. "first": false,
  38. "numberOfElements": 2
  39. }

四、总结

第一种方式实现简单方便,但是不适用于大数据量。第二种分页是原生的方法,不需要做额外的处理,但是查询条件单一,不能设置大于等于或者在某某之间,以及模糊查询有很大的限制。第三种方式实现也很简单,但是更加开放和使用性能好。

发表评论

表情:
评论列表 (有 0 条评论,470人围观)

还没有评论,来说两句吧...

相关阅读