29
我相信这个问题类似于this one,但术语是不同的。来自Mongoose 4 documentation:Mongoose'静态'方法与'实例'方法
我们也可以定义我们自己的自定义文档实例方法。
// 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
方法为好。 Schema中的statics
和methods
对象是什么?有什么区别,为什么我会用另一个呢?
所以,唯一的用法区别是你是否使用模型或调用的方法的文档? – Startec
你不能使用'Animals.findSimilarTypes'因为'Animals'是一个模型,它没有“type”。 'findSimilarTypes'需要一个'this.type',它不会存在于'Animals'模型中,只有一个文档实例会包含该属性,正如模型中定义的那样。 – laggingreflex
同样,你不能做'fido.findByName',因为'findByName'需要搜索***所有***文档和'fido'只是*** ***文档。 – laggingreflex