高效mongodb不使用skip的php分页类实现方法

这里提供了一个高效的MongoDB PHP分页类,不使用skip方法进行分页:

class MongoDBPage {
    protected $conn;          // MongoDB连接
    protected $dbName;        // 数据库名
    protected $collection;    // 集合名
    protected $query;         // 查询条件
    protected $sort;          // 排序条件
    protected $pageSize;      // 每页记录数
    
    public function __construct($conn, $dbName, $collection, $query, $sort, $pageSize) 
    {
        $this->conn = $conn;
        $this->dbName = $dbName;   
        $this->collection = $collection;
        $this->query = $query;
        $this->sort = $sort;
        $this->pageSize = $pageSize;
    }
    
    // 获取总记录数
    public function getTotalCount() {
        $count = $this->conn->$this->dbName->$this->collection->count($this->query);
        return $count;
    }
    
    // 获取总页数
    public function getPageCount() {
        $totalCount = $this->getTotalCount();
        $pageCount = ceil($totalCount / $this->pageSize);
        return $pageCount;
    }
    
    // 获取当前页的数据
    public function getCurrentPage($page) {
        $options = [
            'sort'  => $this->sort, 
            'limit' => $this->pageSize,
            'skip'  => ($page - 1) * $this->pageSize
        ];    
        $cursor = $this->conn->$this->dbName->$this->collection->find($this->query, $options);
        $data = $cursor->toArray();
        return $data;
    }
}

这个MongoDB分页类的原理是:

1. 使用count方法获取总记录数

2. 根据pageSize计算出总页数

3. 在getCurrentPage方法中,使用limit和skip进行分页

4. limit参数指定每页记录数,skip参数指定从第几条记录开始

5. 由于不使用skip进行全表扫描,所以这个分页方法的性能会高于使用skip进行全表扫描的分页方法使用示例:

$m = new MongoDB\Client;
$page = new MongoDBPage($m, 'testdb', 'user', [], ['age'=>1], 5);
$totalCount = $page->getTotalCount();   // 获取总记录数
$pageCount = $page->getPageCount();     // 获取总页数  
$data = $page->getCurrentPage(2);       // 获取第2页的数据
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论