mongodb多條件分頁查詢的三種方法(轉)


一、使用limit和skip進行分頁查詢

public List<User> pageList(int pageNum ,int pageSize){
    List<User> userList = new ArrayList<>();
    Mongo mg = new Mongo();
    DB db = mg.getDB("data");
    DBCollection coll = db.getCollection("t_user");
    DBCursor limit = coll.find().skip((pageNum-1)*pageSize).sort(new BasicDBObject()).limit(pageSize);
    while (limit.hasNext()){
        userList.add(parse(new User(),limit.next()));
    }
    return userList;
}

private User parse(User user,DBObject obj){
    user.setAge((int) obj.get("age"));
    user.setName((String)obj.get("name"));
    user.setPwd((String)obj.get("pwd"));
    return user;
}

//查詢結果 1,2
[
  {
    "id": null,
    "name": "ljl",
    "pwd": "123456",
    "age": 24
  },
  {
    "id": null,
    "name": "lsr",
    "pwd": "123456",
    "age": 18
  }
]

通過skip和limit方法可以簡單的實現分頁操作,但是如果數據量特別巨大的時候,會出現性能的問題,建議不使用!

二、通過原生的方法實現條件查詢、分頁和排序

public Page<User> getPageByOriginalFunction(int age,int pageNUmber,int pageSize){
    //查詢條件,可以傳遞多個查詢條件
    User user = new User();
    user.setAge(age);
    Example<User> example = Example.of(user);

    //分頁條件
    //Pageable pageable = new PageRequest(pageNUmber,pageSize);
    Pageable pageable = PageRequest.of(pageNUmber,pageSize);

    return secondRepository.findAll(example,pageable);

}

//查詢結果
{
  "content": [
    {
      "id": "5cfb69ee4332ce07b864d12e",
      "name": "lsr",
      "pwd": "123456",
      "age": 18
    }
  ],
  "pageable": {
    "sort": {
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageSize": 2,
    "pageNumber": 0,
    "unpaged": false,
    "paged": true
  },
  "last": true,
  "totalPages": 1,
  "totalElements": 1,
  "number": 0,
  "size": 2,
  "sort": {
    "sorted": false,
    "unsorted": true
  },
  "first": true,
  "numberOfElements": 1
}

三、通過實現Pageable接口,自定義

1.創建自定義分頁類,實現Pageable接口

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import javax.validation.constraints.Min;

@NoArgsConstructor
@AllArgsConstructor
public class SpringDataPageAble implements Pageable {

    @Min(1)
    private Integer pageNumber = 1;
    @Min(1)
    private Integer pageSize = 10;
    private Sort sort;

    public void setSort(Sort sort) {
        this.sort = sort;
    }

    // 當前頁面
    @Override
    public int getPageNumber() {
        return this.pageNumber;
    }

    // 每一頁顯示的條數

    @Override
    public int getPageSize() {
        return getPagesize();
    }

    // 第二頁所需要增加的數量

    @Override
    public long getOffset() {
        return (getPageNumber() - 1) * getPagesize();
    }

    @Override
    public Sort getSort() {
        return sort;
    }

    public void setPagenumber(Integer pagenumber) {
        this.pageNumber = pageNumber;
    }

    public Integer getPagesize() {
        return this.pageSize;
    }

    public void setPagesize(Integer pagesize) {
        this.pageSize = pagesize;
    }

    @Override
    public Pageable next() {
        return null;
    }

    @Override
    public Pageable previousOrFirst() {
        return null;
    }

    @Override
    public Pageable first() {
        return null;
    }

    @Override
    public boolean hasPrevious() {
        return false;
    }
}

2.在repository層定義分頁方法

import com.tedu.huawei.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserFirstRepository extends MongoRepository<User,String> {
    Page<User> getUserByAgeGreaterThan(int age, Pageable pageAble);
}

3.service層調用方法

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

查詢結果顯示

{
  "content": [
    {
      "id": "5cfb66114332ce07b864d12d",
      "name": "lsr",
      "pwd": "123456",
      "age": 18
    },
    {
      "id": "5cfb85084332ce4ffca97907",
      "name": "panzi",
      "pwd": "654321",
      "age": 24
    }
  ],
  "pageable": {
    "pageNumber": 1,
    "pageSize": 2,
    "sort": {
      "sorted": true,
      "unsorted": false
    },
    "offset": 0,
    "pagesize": 2,
    "unpaged": false,
    "paged": true
  },
  "last": true,
  "totalPages": 1,
  "totalElements": 2,
  "number": 1,
  "size": 2,
  "sort": {
    "sorted": true,
    "unsorted": false
  },
  "first": false,
  "numberOfElements": 2
}

四、總結
第一種方式實現簡單方便,但是不適用於大數據量。第二種分頁是原生的方法,不需要做額外的處理,但是查詢條件單一,不能設置大於等於或者在某某之間,以及模糊查詢有很大的限制。第三種方式實現也很簡單,但是更加開放和使用性能好。


————————————————
版權聲明:本文為CSDN博主「笑不語」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43935907/article/details/91354738

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM