In Sails.js, a lot of work is done for you by generating the models and controllers. The controllers allow for access to the data through API's. It allows for easy pagination by passing the start/skip/offset and take/limit. But in order for me to determine the maximum page of a collection I need to know how many items are in a collection.
I have tried to extend the blueprint in the generator to expose a new API method count
and create the count action. According to the Waterline documentation, count
is an action that can be called on the model. When I call User.count()
, I get this:
{ _context:
{ identity: 'user',
adapter:
{ syncable: false,
defaults: [Object],
registerCollection: [Function],
create: [Function],
find: [Function],
update: [Function],
destroy: [Function],
count: [Function],
identity: 'odata',
globalId: 'odata',
config: [Object] },
attributes: {},
_cast: { _types: [Object] },
_schema: { context: [Circular], schema: [Object], hasSchema: true },
_validator: { validations: {} },
_callbacks:
{ beforeValidation: [Object],
afterValidation: [Object],
beforeUpdate: [Object],
afterUpdate: [Object],
beforeCreate: [Object],
afterCreate: [Object],
beforeDestroy: [Object],
afterDestroy: [Object] },
_instanceMethods: {},
autoPK: true,
autoCreatedAt: true,
autoUpdatedAt: true,
hasSchema: true,
migrate: 'alter',
_model: { [Function] extend: [Function], inject: [Function], __super__: {} },
_transformer: { _transformations: {} },
_tableName: 'user',
_adapterDefs: [ [Object] ],
_adapter:
{ adapter: [Object],
adapterDefs: [Object],
query: [Circular],
collection: 'user' },
syncable: [Function],
defaults: [Function],
registerCollection: [Function],
config: [Function],
findOneById: [Function: dynamicMethod],
findOneByIdIn: [Function: dynamicMethod],
findOneByIdLike: [Function: dynamicMethod],
findById: [Function: dynamicMethod],
findByIdIn: [Function: dynamicMethod],
findByIdLike: [Function: dynamicMethod],
countById: [Function: dynamicMethod],
countByIdIn: [Function: dynamicMethod],
countByIdLike: [Function: dynamicMethod],
idStartsWith: [Function: dynamicMethod],
idContains: [Function: dynamicMethod],
idEndsWith: [Function: dynamicMethod],
findOneByCreatedAt: [Function: dynamicMethod],
findOneByCreatedAtIn: [Function: dynamicMethod],
findOneByCreatedAtLike: [Function: dynamicMethod],
findByCreatedAt: [Function: dynamicMethod],
findByCreatedAtIn: [Function: dynamicMethod],
findByCreatedAtLike: [Function: dynamicMethod],
countByCreatedAt: [Function: dynamicMethod],
countByCreatedAtIn: [Function: dynamicMethod],
countByCreatedAtLike: [Function: dynamicMethod],
createdAtStartsWith: [Function: dynamicMethod],
createdAtContains: [Function: dynamicMethod],
createdAtEndsWith: [Function: dynamicMethod],
findOneByUpdatedAt: [Function: dynamicMethod],
findOneByUpdatedAtIn: [Function: dynamicMethod],
findOneByUpdatedAtLike: [Function: dynamicMethod],
findByUpdatedAt: [Function: dynamicMethod],
findByUpdatedAtIn: [Function: dynamicMethod],
findByUpdatedAtLike: [Function: dynamicMethod],
countByUpdatedAt: [Function: dynamicMethod],
countByUpdatedAtIn: [Function: dynamicMethod],
countByUpdatedAtLike: [Function: dynamicMethod],
updatedAtStartsWith: [Function: dynamicMethod],
updatedAtContains: [Function: dynamicMethod],
updatedAtEndsWith: [Function: dynamicMethod] },
_method: [Function],
_criteria: {},
_values: null }
Note: I am using a custom adapter, but I have created a count
method for the adapter.
To get the count of the number of objects in user collection:
User.count(function (err, num) {
if(err) {
return console.log(err);
}
console.log(num);
});
To wrap User.count in another method:
yourMethod = function (callback) {
User.count(callback);
}
Now you can use sails installable hook to achieve count functionality through blueprint api methods.
I explained it in this answer: Get total count in Sails JS blueprint API
You can also pass query to the count function to get the count for a subset of items in a collection that satisfy a certain condition.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With