mongo查询时,能否先统计数量,再获取skip和limit后的值?

因为经常要做分页, 所以需要用到 skip和limit来获取当前页的值,
但是 在获取总页数, 所以有没有方式可以在一次查询中获取 总页数和 当前页的值?

现在是 分两次查询,结果再结合在一起。

1. count()
2. .skip(*).limit(*)
阅读 9.2k
3 个回答

没有一次查询返回的,不过你可以将这两个方法封装一下,每次调用不就可以么?

async function getPage(pageNo, pageSize, query) {
    let count = await db.count(query);
    let list = await db.find(query).skip((pageNo - 1)*pageSize).limit(pageSize);
    return {
        count,
        list
    };
}

楼上的表述基本正确。不过代码还有可以优化的地方。countfind/skip/limit是典型的可以并行的运算。上面的写法变成了查完一个再查另外一个,有违nodejs的理念。改进一下:

async function getPage(pageNo, pageSize, query) {
    result = await Promise.all([
        db.count(query),
        db.find(query).skip((pageNo - 1)*pageSize).limit(pageSize)
    ]);
    return {
        count: result[0],
        list: result[1]
    };
}

我觉得楼上的两种做法欠妥,因为count的实现是这样的

> db.tasks.count
function ( x ){
    return this.find( x ).count();
}

这是在mongodb的cli里面输出的。
一句话概述就是count其实还是调用的find
所以这种查两次数据库的方法我认为是欠妥的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题