【问题标题】:How to split mongodb query into result pages如何将 mongodb 查询拆分为结果页面
【发布时间】:2014-04-12 22:35:52
【问题描述】:

我有一个只创建用户、管理会话和删除用户的学习应用程序。后端在 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 个用户不是正确的方法,但我想不通找出正确的方法是什么。

我已经用谷歌搜索了,但没有找到我想要的答案。还可以快速查看 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 );
  });
};

【问题讨论】:

  • 您可以在文档中查看limit 和skip 的选项。但这可能不是最好的选择,您实际上应该寻找可以进行范围查询的东西,例如日期,如果结果是自然顺序,甚至是 DocumentId。文档实际上也这么说。但就目前而言,您的问题目前没有任何可以提供合理建议的地方。显示一些数据或至少显示您的排序意图。

标签: node.js mongodb mongoose


【解决方案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 })

【讨论】:

  • 谢谢,这正是我想要的。由于我还处于早期阶段,我还不太关心排序,但我肯定会在不久的将来。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多