9
\$\begingroup\$

Background

I have a query in Mongoose that finds a set of objects, and then returns these said objects together with the total number of them:

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

To achieve this I do:

  1. find query with params
  2. use limit and skip to obtain results from correct page
  3. if docs is not empty, start a count query
  4. return information

Problem

The problem here, since I need pagination in the query, is that I have to make 2 separate requests to the DB (find and count) which can potential be very heavy.

To optimize this, I would like to avoid the count query, but I don't know how.

Another issue is the nested promises anti pattern, but that is not the issue I would like to focus on right now.

Question

I am open to any suggestions on improving this code you may have!

\$\endgroup\$

1 Answer 1

7
\$\begingroup\$

Solution

After reviewing many answers, I believe I have two options:

  1. Make two queries, like I am doing now,
  2. Use a pagination plugin for mongoose

My decision was the second one and so I am now using mongoose-paginate.

Hope it helps.

\$\endgroup\$
3
  • \$\begingroup\$ I am still using the 2 query method up to now. I wish there was an auto index for this kind of total count. \$\endgroup\$
    – kabuto178
    Commented Sep 21, 2017 at 0:48
  • \$\begingroup\$ This lib mongoose-paginate does the same 2 queries: run the query first and again with count. promises = { docs: docsQuery.exec(), count: this.count(query).exec() }; \$\endgroup\$
    – jpenna
    Commented May 18, 2019 at 13:42
  • \$\begingroup\$ And count is deprecated, by the way. Use countDocuments or estimateCountDocuments if it is a big set. Mongoose count \$\endgroup\$
    – jpenna
    Commented May 19, 2019 at 4:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.