javascript - Mongoose:改进 find() 和 count() 查询

标签 javascript node.js mongodb mongoose es6-promise

背景

我在 Mongoose 中有一个查询,它查找一组对象,然后返回这些对象及其总数:

var itemsPerPage = 4, pageNum = 1;

Survey.find({})
    .limit(itemsPerPage)
    .skip(itemsPerPage * pageNum)
    .then(docs => {
        if (docs.length === 0)
            console.log("There are no results matching your query.");
        else
            DocModel.count({})
                .then(number => {
                    console.log(JSON.stringify({number, docs}));
                });
        })
        .catch(console.log);

为了实现这一目标,我这样做:

  1. 查找带参数的查询
  2. 使用limitskip从正确的页面获取结果
  3. 如果 docs 不为空,则启动 count 查询
  4. 返回信息

问题

这里的问题是,由于我需要在查询中分页,因此我必须向数据库发出 2 个单独的请求(findcount),这可能会非常繁重。

为了优化这一点,我想避免 count 查询,但我不知道如何做。

另一个问题是嵌套的 Promise 反模式,但这不是我现在想关注的问题。

问题

我愿意接受任何有关改进此代码的建议!

最佳答案

您可以安装mongoose paginate这使得事情变得更容易。

npm install mongoose-paginate

之后

/**
* querying for `all` {} items in `MyModel`
* paginating by second page, 10 items per page (10 results, page 2)
**/

MyModel.paginate({}, 2, 10, function(error, pageCount, paginatedResults) {
    if (error) {
        console.error(error);
    } else {
        console.log('Pages:', pageCount);
        console.log(paginatedResults);
    }
}

希望这对您有用。谢谢:-)

关于javascript - Mongoose:改进 find() 和 count() 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167668/

相关文章:

javascript - IE9 中的 LinkedIn Javascript API 授权失败

node.js - (node :20732) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. 将来在nodejs中

mongodb - 在GraphQL应用程序中实现 Swagger 最佳方法

java - 带有 jQ​​uery Ajax/JSON 前端的 MongoDB 或 CouchDB 中间件

javascript - 一旦父组件的获取调用完成,如何提醒子组件? ReactJS

javascript - 为 jQuery 弹出窗口堆叠 div 元素

javascript - 如何在javascript中将两个不同的对象数组组合成一个新的对象数组?

node.js - 使用 puppeteer 在选项卡之间切换

angularjs - 有没有办法将一千张图像转储到某处并使用 REST Api 提取它们?

javascript - Node.js 和浏览器之间的测试行为不同