首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mongoose实现分页和合计

如何使用mongoose实现分页和合计
EN

Stack Overflow用户
提问于 2018-01-30 20:48:25
回答 3查看 12.3K关注 0票数 6

我还没有找到如何返回包含在结果集中的全部数据。有没有办法返回全部数据?我需要确认返回了正确的JSON数据。

我想要的是像这样返回的东西:

代码语言:javascript
复制
total: 40,
page: 1,
pageSize: 3,
books: [
{
    _id: 1,
    title: "达·芬奇密码 ",
    author: "[美] 丹·布朗",
},
{
   _id: 2,
   title: "梦里花落知多少",
   author: "郭敬明",
 },
 {
    _id: 3,
    title: "红楼梦",
    author: "[清] 曹雪芹",
   }
 ]
}

当前代码:

代码语言:javascript
复制
router.get('/booksquery', (req, res) => {

var page = parseInt(req.query.page) || 1;
var limit = parseInt(req.query.limit) || 3;

Book.find({})
    .sort({ update_at: -1 })
    .skip((page-1) * limit)
    .limit(limit)
    .exec((err, doc) => {
        if (err) {
            res.json(err)
        } else {
            res.json({
                total: doc.total,
                page: page,
                pageSize: limit,
                books:doc,
            });
        }
    })
 })
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-30 21:00:10

也许你可以这样做:

限制仅当当前页索引为默认值0并且分页从下一页开始时,即1,您可以执行限制(

*.skip),确保.skip()和.limit()获得Number。

代码语言:javascript
复制
  router.get("/booksquery", (req, res) => {
  var page = parseInt(req.query.page) || 0; //for next page pass 1 here
  var limit = parseInt(req.query.limit) || 3;
  var query = {};
  Book.find(query)
    .sort({ update_at: -1 })
    .skip(page * limit) //Notice here
    .limit(limit)
    .exec((err, doc) => {
      if (err) {
        return res.json(err);
      }
      Book.countDocuments(query).exec((count_error, count) => {
        if (err) {
          return res.json(count_error);
        }
        return res.json({
          total: count,
          page: page,
          pageSize: doc.length,
          books: doc
        });
      });
    });
});

从上面你会得到如下的响应:

代码语言:javascript
复制
 {
  books: [
    {
      _id: 1,
      title: "达·芬奇密码 ",
      author: "[美] 丹·布朗"
    },
    {
      _id: 2,
      title: "梦里花落知多少",
      author: "郭敬明"
    },
    {
      _id: 3,
      title: "红楼梦",
      author: "[清] 曹雪芹"
    }
  ],
  total: 3,
  page: 0,
  pageSize: 3
}

如果您使用任何条件,且超过该条件,则需要进行查询,并在此基础上获得结果和总和。在var query ={}中执行此操作。同样的查询也将用于.count()。所以你可以得到total count关于这个条件的基础知识。

票数 18
EN

Stack Overflow用户

发布于 2020-08-18 06:28:22

如果有人想在2020年使用async/await和一些随机查询而不是空对象来查看这一点。请记住,使用查询筛选器不能使用estimatedDocumentCount,需要通过使用查询对其执行countDocuments。请检查:

代码语言:javascript
复制
  const { userId, page, limit } = req.headers;

  const query = {
    creator: userId,
    status: {
      $nin: ['deleted'],
    },
  };



  const page_ = parseInt(page, 10) || 0;

  const limit_ = parseInt(limit, 10) || 12;

  const books = await BookModel.find(query)
    .sort({ update_at: -1 })
    .skip(page_ * limit_)
    .limit(limit_);

  const count = await BookModel.countDocuments(query);
票数 1
EN

Stack Overflow用户

发布于 2020-07-07 00:22:44

count()已被弃用(格式为mongoose@5.x)。对于大型集合,estimatedDocumentCount()比使用countDocuments()更快,因为estimatedDocumentCount()使用集合元数据而不是扫描整个集合。参考:https://mongoosejs.com/docs/api/model.html#model_Model.estimatedDocumentCount

所以代码是完美的,只需将countDocuments替换为estimatedDocumentCount

代码语言:javascript
复制
router.get("/booksquery", (req, res) => {
  var page = parseInt(req.query.page) || 0; //for next page pass 1 here
  var limit = parseInt(req.query.limit) || 3;
  var query = {};
  Book.find(query)
    .sort({ update_at: -1 })
    .skip(page * limit) //Notice here
    .limit(limit)
    .exec((err, doc) => {
      if (err) {
        return res.json(err);
      }
      Book.estimatedDocumentCount(query).exec((count_error, count) => {
        if (err) {
          return res.json(count_error);
        }
        return res.json({
          total: count,
          page: page,
          pageSize: doc.length,
          books: doc
        });
      });
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48521896

复制
相关文章

相似问题

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