如何将mongodb查询拆分为结果页面

时间:2014-04-11 02:58:41

标签: node.js mongodb mongoose

我有学习应用程序,只创建用户,管理会话和删除用户。后端位于Node.js。

我有查询用户列表的查询

var userList = function ( page, callback ) {
  user.find({}, function ( err, doc ) {
    if (err) {
      callback (err);
    }
    callback ( doc );
  });
};

然后我有把它发送回应用程序的处理程序

var userList = function ( req, res ) {
  var page = req.param.page;
  models.account.userList( page, function ( result ) {
  res.json ( 200, result );
  });
};

在客户端,我将结果显示在浏览器的表格中。

我想要完成的是将列表拆分为......让我们说每个10个用户。因此,使用函数userList的参数Page,我希望能够发送正确的答案:

第1页:结果0到9 第2页:结果10到19 等

我可以做一个循环来提取我想要的东西,但我确信从查询中收到整个用户列表在循环上重新处理它只能提取10个用户不是正确的方法,但我无法想象找出正确的方法。

我已经用Google搜索了,但找不到我想要的答案。还快速查看MongoDB文档。

你可以猜到我是新人。

你能帮我指导一下这个简单任务的正确方法吗?

非常感谢你。

使用bduran代码,我能够完成我想要的分页。答案后面的代码是:

var userList = function ( page, itemsPerPage, callback ) {
  user
  .find()
  .skip( (page - 1) * itemsPerPage )
  .limit ( itemsPerPage )
  .exec ( function ( err, doc ) {
    if (err) {
      //do something if err;
    }
    callback ( doc );
  });
};

1 个答案:

答案 0 :(得分:1)

最简单直接的方法是使用跳过和查询。您可以选择十个元素的页面,然后跳过每页数十倍的页面。使用此方法,您不需要获取所有元素,如果查询已排序,并且索引非常快:

user
.find()
.skip((page-1)*10)
.limit(10)
.exec(function(err, doc){
  /*Rest of the logic here*/
});

如果需要以非自然顺序(with .sort)对结果进行排序,则需要在数据库中创建索引以加速和优化查询。你可以做with .ensureIndex。在终端中放置您用来执行的查询,您就完成了。

db.user.ensureIndex({ createdAt: -1 })