What is the use of mongoose methods and statics?
Database logic should be encapsulated within the data model. Mongoose provides 2 ways of doing this, methods and statics. Methods adds an instance method to documents whereas Statics adds static "class" methods to the Models itself.
Given the example Animal Model below:
var AnimalSchema = mongoose.Schema({ name: String, type: String, hasTail: Boolean});module.exports = mongoose.model('Animal', AnimalSchema);
We could add a method to find similar types of animal, and a static method to find all animals with tails:
AnimalSchema.methods.findByType = function (cb) { return this.model('Animal').find({ type: this.type }, cb);};AnimalSchema.statics.findAnimalsWithATail = function (cb) { Animal.find({ hasTail: true }, cb);};
Here's the full model with example usage for methods and statics:
var AnimalSchema = mongoose.Schema({ name: String, type: String, hasTail: Boolean});AnimalSchema.methods.findByType = function (cb) { return this.model('Animal').find({ type: this.type }, cb);};AnimalSchema.statics.findAnimalsWithATail = function (cb) { Animal.find({ hasTail: true }, cb);};module.exports = mongoose.model('Animal', AnimalSchema);// example usage:var dog = new Animal({ name: 'Snoopy', type: 'dog', hasTail: true});dog.findByType(function (err, dogs) { console.log(dogs);});Animal.findAnimalsWithATail(function (animals) { console.log(animals);});
If i wanted to retrieve animals with hasTail
i could simply change this line of code:
return this.model('Animal').find({ type: this.type }, cb);
to:
return this.model('Animal').find({ hasTail: true }, cb);
and i would not have to create a statics function.
Use method on individual documents if you want to manipulate the individual document like adding tokens etc.Use the statics approach if you want query the whole collection.