Mongoose如何实现分页和总计?

  |   Node.js mongodb mongoose mongodb-query

我还没有找到如何返回结果集中包含的总数据。有什么方法可以返回总数据吗?我需要确认返回了正确的JSON数据。

我想要的是有这样的结果:

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

当前代码:

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,
            });
        }
    })
})

网友帮我解决好了如下:

也许你可以这样做:

只有当前页面索引是0默认和分页开始下一页,即1,你可以做.skip(page * limit)确保.skip().limit()获取数字。

  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.count(query).exec((count_error, count) => {
        if (err) {
          return res.json(count_error);
        }
        return res.json({
          total: count,
          page: page,
          pageSize: doc.length,
          books: doc
        });
      });
    });
});

从上面你会得到如下回应:

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