首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用mongodb和php正确处理分页查询?

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

Stack Overflow用户
提问于 2010-06-10 07:42:29
回答 2查看 19.9K关注 0票数 18

我这样做对吗?我用MySQL查看了一些旧的PHP代码,我设法让它工作了,但是我想知道是否有一种更“干净”和“更快”的方法来完成这项工作。

首先,我需要获取“文档”的总数

$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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-10 18:32:58

因为Mongo_Cursor ()、->limit()、->skip()的结果是一个Mongo_Cursor,所以不需要执行两次实际的查询。

下面的代码也应该可以使用:

$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;

顺便说一句,我第一次误读了你的问题,我以为你不知道limit & skip。

票数 22
EN

Stack Overflow用户

发布于 2010-06-10 19:50:08

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

下面是一个分页示例:

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}}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3010744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档