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

时间:2017-04-02 11:14:53

标签: 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. find使用参数查询
  2. 使用limitskip从正确的页面获取结果
  3. 如果docs不为空,请启动count查询
  4. 返回信息
  5. 问题

    这里的问题,因为我在查询中需要分页,我必须向DB(findcount)发出2个单独的请求,这些请求可能非常繁重。

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

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

    问题

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

1 个答案:

答案 0 :(得分:1)

您可以安装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);
    }
}

之后

System.out.println("If you want to leave, type \"quit\"");
System.out.println("If you want to play again,type\"yes\" ");

Scanner input = new Scanner(System.in);
String s=input.next();
if(s.equals("quit")) {
    System.out.println("Thanks for playing the game!");
    System.exit(0);
}
if (s.equals("yes")) {     
    String userInput = input.nextLine();
    userInput = userInput.toUpperCase();
    startGame(); 

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