代码之家  ›  专栏  ›  技术社区  ›  sdot257

如何使用mongodb和php正确处理分页查询?

  •  17
  • sdot257  · 技术社区  · 15 年前

    我做得对吗?我看了一些旧的PHP代码w/mysql,我已经设法让它工作了,但是我想知道是否有一种更“干净”和“更快”的方式来完成这项工作。

    首先,我需要得到“文档”的总数

    $total_documents = $collection->find(array("tags" => $tag, 
            "seeking" => $this->session->userdata('gender'), 
            "gender" => $this->session->userdata('seeking')))->count();
    
    $skip = (int)($docs_per_page * ($page - 1));
    $limit = $docs_per_page;
    $total_pages = ceil($total_documents / $limit);
    

    //查询以填充数组,以便使用分页显示

    $data['result'] = $collection->find(array("tags" => $tag, 
            "seeking" => $this->session->userdata('gender'), 
            "gender" => $this->session->userdata('seeking')))->limit($limit)->skip($skip)->sort(array("_id" => -1));
    

    我的问题是,我能一次性运行查询吗?我基本上运行了两次相同的查询,除了第二次传递值以便在记录之间跳过。

    ——新密码…

    好吧,除非有人知道另一种方法(如果可能的话),否则我会说这是不可行的。有了这句话,我改变了通过MongoDB运行查询的方式,它生成了外观更好的代码。;-)我曾试图最小化到数据库的访问,但希望这不会影响性能。我的另一个尝试是计算数组中元素的数量,但很快发现这不起作用,因为$limit&$skip参数会给出它的文档总数。

    $skip = (int)($docs_per_page * ($page - 1));
    $limit = $docs_per_page;
    
    $query = array("loc" => array('$near' => array('lat' => $latitude, 'lon' => $longitute) ),
            "tags" => $tag, "seeking" => $this->session->userdata('gender'),
            "gender" => $this->session->userdata('seeking'));
    
    $fields = array("username", "zipcode", "tags", "birth_date");
    $total_documents = $collection->find($query, array("_id"))->count();
    $data['result'] = $collection->find($query, $fields)->limit($limit)->skip($skip);
    
    2 回复  |  直到 15 年前
        1
  •  21
  •   wimvds    15 年前

    由于find()->limit()->skip()的结果是一个mongo光标,因此您不必执行实际查询两次。

    以下内容也应该有效:

    $skip = (int)($docs_per_page * ($page - 1));
    $limit = $docs_per_page;
    
    $query = array("loc" => array('$near' => array('lat' => $latitude, 'lon' => $longitute) ),
        "tags" => $tag, "seeking" => $this->session->userdata('gender'),
        "gender" => $this->session->userdata('seeking'));
    
    $fields = array("username", "zipcode", "tags", "birth_date");
    $cursor = $collection->find($query, $fields)->limit($limit)->skip($skip);
    $total_documents = $cursor->count();
    $data['result'] = $cursor;
    

    顺便说一句,我第一次误解了你的问题,我以为你不知道什么是极限和跳跃。

        2
  •  1
  •   M A Hossain Tonu    15 年前

    是的,你做得对。 您可以一次运行查询。

    下面是一个分页示例:

    function printStudents(pageNumber, nPerPage) {
       print("Page: " + pageNumber);
       db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
    }
    

    参考文献: Advanced Queries - MongoDB: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-{{skip%28%29}}