8

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.

Kristian Ačkar
  • 895
  • 1
  • 9
  • 13

4 Answers4

1
getLength: function(req, res) {
    Posts.find({}).exec(function(err, items){

        return items.length;
    });
}
Matan Gubkin
  • 3,019
  • 6
  • 25
  • 44
  • 2
    Yes, 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
  • 5
    Yes, 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