Is there a way to do select query and count_all query via single method? For pagination purposes we need to know total number of items so we can calculate and show number of pages.
Asked
Active
Viewed 4,671 times
4 Answers
1
getLength: function(req, res) {
Posts.find({}).exec(function(err, items){
return items.length;
});
}

Matan Gubkin
- 3,019
- 6
- 25
- 44
-
2Yes, but when doing pagination you usually set some criteria in find method like skip and limit so then items.length is not the total number of items in database. – Kristian Ačkar Jun 09 '15 at 13:33
-
You could filter the search query. check out this: http://sailsjs.org/#!/documentation/concepts/ORM/Querylanguage.html – Matan Gubkin Jun 09 '15 at 13:38
1
Check out Sails.Js - How I do pagination in sails.Js for pagination in Waterline.
To get the total number of items, you can use:
Post.count().exec(function (err, nbOfInstances) {
if(err) return res.negociate(err);
return res.ok(nbOfInstances);
});

Community
- 1
- 1

Yann Bertrand
- 3,084
- 1
- 22
- 38
-
5Yes, but then I need to call Post.find().skip(10).limit(10).exec() { ... } to get posts for specific page and that is two method calls. My questions was is there some method that do both requests and returns specific posts collection and a number of total posts in db. What I want is one method with both informations so I have less coding. – Kristian Ačkar Jun 10 '15 at 14:43
1
First you query and get data after that you delete limit, skip parameters and get count
delete query._criteria.limit;
delete query._criteria.skip;
Model.count(query._criteria).exec(function countCB(error, count) {
});

rash111
- 1,307
- 4
- 19
- 35
1
I also couldn't find any built-in method to do that in one request so I do it like this:
let queryParams = {},
pageNo = 1,
perPage = 10;
Post.count(queryParams)
.then(_count=>{
return {posts_count: _count,
posts: Post.find(queryParams).paginate({page: pageNo, limit: perPage})};
})
.then(res.ok)
.catch(err=>res.negotiate(err.message));
OUTPUT:
/*
{
posts_count: 0,
posts: []
}
*/

Raza Ahmed
- 2,661
- 2
- 35
- 46