Get a count of total documents with MongoDB when using limit
Mongodb 3.4 has introduced $facet
aggregation
which processes multiple aggregation pipelines within a single stage on the same set of input documents.
Using $facet
and $group
you can find documents with $limit
and can get total count.
You can use below aggregation in mongodb 3.4
db.collection.aggregate([ { "$facet": { "totalData": [ { "$match": { }}, { "$skip": 10 }, { "$limit": 10 } ], "totalCount": [ { "$group": { "_id": null, "count": { "$sum": 1 } }} ] }}])
Even you can use $count
aggregation which has been introduced in mongodb 3.6.
You can use below aggregation in mongodb 3.6
db.collection.aggregate([ { "$facet": { "totalData": [ { "$match": { }}, { "$skip": 10 }, { "$limit": 10 } ], "totalCount": [ { "$count": "count" } ] }}])
No, there is no other way. Two queries - one for count - one with limit. Or you have to use a different database. Apache Solr for instance works like you want. Every query there is limited and returns totalCount.
MongoDB allows you to use cursor.count()
even when you pass limit()
or skip()
.
Lets say you have a db.collection
with 10 items.
You can do:
async function getQuery() { let query = await db.collection.find({}).skip(5).limit(5); // returns last 5 items in db let countTotal = await query.count() // returns 10-- will not take `skip` or `limit` into consideration let countWithConstraints = await query.count(true) // returns 5 -- will take into consideration `skip` and `limit` return { query, countTotal } }