2014-04-11 55 views
2

我已经学习了只能创建用户,管理会话和删除用户的应用程序。后端在Node.js中。如何将mongodb查询拆分为结果页面

我有获取一个用户列表中查询

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个。因此,使用该功能用户列表的参数页我希望到正确的答案发送:

第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); 
    }); 
}; 
+0

你可以看看的选项[极限](http://docs.mongodb.org/manual/reference/method/cursor.limit/)和[跳过](HTTP://docs.mongodb .org/manual/reference/method/cursor.skip /)。但是这可能不是最好的选择,如果结果是自然顺序的,你应该实际寻找一些你可以做的范围查询,如日期甚至是DocumentId。文件实际上也是这样说的。但就目前来看,目前你的问题并没有什么合理的建议。显示一些数据或者至少是你的分类意图。 –

回答

1

最简单且直接的方式来做到这一点是跳跃和查询。您选择例如十个元素的页面,然后每页跳过该数字的十倍。使用这种方法,你不必让所有的元素,如果查询与排序,索引是非常快:

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

如果您需要在非自然秩序的结果(with .sort)进行排序,你会需要在数据库中创建一个索引来加速和优化查询。你可以这样做。在终端把你用来做的查询,你完成。

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

谢谢,这正是我所寻找的。由于我处于早期阶段,所以我不太在意排序,但我确信我会在不久的将来。 – Gabriel