猫鼬的“静态"方法与“实例"方法 [英] Mongoose 'static' methods vs. 'instance' methods
问题描述
我认为这个问题类似于这一个问题,但用语有所不同.从猫鼬4 文档:
我们也可以定义自己的自定义文档实例方法.
// define a schema
var animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
}
现在我们所有的动物实例都可以使用findSimilarTypes方法.
然后:
向模型添加静态方法也很简单.继续我们的animalSchema:
// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
return this.find({ name: new RegExp(name, 'i') }, cb);
}
var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
console.log(animals);
});
似乎使用静态方法,每个动物实例也将具有findByName
方法.架构中的statics
和methods
对象是什么?有什么区别,为什么我要在另一个上使用?
statics
是在模型上定义的方法. methods
在文档(实例)上定义.
您可以使用静态方法,例如Animal.findByName
:
const fido = await Animal.findByName('fido');
// fido => { name: 'fido', type: 'dog' }
您可能会使用实例方法,如fido.findSimilarTypes
:
const dogs = await fido.findSimilarTypes();
// dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ]
但是您不会做Animals.findSimilarTypes()
,因为动物是模型,它没有类型". findSimilarTypes
需要在动物模型中不存在的this.type
,只有文档实例将包含模型中定义的该属性.
类似地,您不会做fido.findByName
,因为findByName
需要搜索所有文档,而fido
只是 a 文档.
¹好吧,从技术上讲,您可以,因为实例确实可以访问该集合( @AaronDufour 指出了这一点) >
I believe this question is similar to this one but the terminology is different. From the Mongoose 4 documentation:
We may also define our own custom document instance methods too.
// define a schema
var animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
}
Now all of our animal instances have a findSimilarTypes method available to it.
And then:
Adding static methods to a Model is simple as well. Continuing with our animalSchema:
// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
return this.find({ name: new RegExp(name, 'i') }, cb);
}
var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
console.log(animals);
});
It seems with static methods each of the animal instances would have the findByName
method available to it as well. What are the statics
and methods
objects in a Schema? What is the difference and why would I use one over the other?
statics
are the methods defined on the Model. methods
are defined on the document (instance).
You might use a static method like Animal.findByName
:
const fido = await Animal.findByName('fido');
// fido => { name: 'fido', type: 'dog' }
And you might use an instance method like fido.findSimilarTypes
:
const dogs = await fido.findSimilarTypes();
// dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ]
But you wouldn't do Animals.findSimilarTypes()
because Animals is a model, it has no "type". findSimilarTypes
needs a this.type
which wouldn't exist in Animals model, only a document instance would contain that property, as defined in the model.
Similarly you wouldn't¹ do fido.findByName
because findByName
would need to search through all documents and fido
is just a document.
¹Well, technically you can, because instance does have access to the collection (this.constructor
or this.model('Animal')
) but it wouldn't make sense (at least in this case) to have an instance method that doesn't use any properties from the instance. (thanks to @AaronDufour for pointing this out)
这篇关于猫鼬的“静态"方法与“实例"方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!