2015-04-16 155 views
29

我相信这个问题类似于this one,但术语是不同的。来自Mongoose 4 documentationMongoose'静态'方法与'实例'方法

我们也可以定义我们自己的自定义文档实例方法。

// 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中的staticsmethods对象是什么?有什么区别,为什么我会用另一个呢?

回答

38

statics是模型上定义的方法。在文档(实例)上定义了methods

你可能会做

Animal.findByName('fido', function(err, fido){ 
    // fido => { name: 'fido', type: 'dog' } 
}); 

然后你可以使用文档实例fido

fido.findSimilarTypes(function(err, dogs){ 
    // dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ] 
}); 
+0

所以,唯一的用法区别是你是否使用模型或调用的方法的文档? – Startec

+5

你不能使用'Animals.findSimilarTypes'因为'Animals'是一个模型,它没有“type”。 'findSimilarTypes'需要一个'this.type',它不会存在于'Animals'模型中,只有一个文档实例会包含该属性,正如模型中定义的那样。 – laggingreflex

+2

同样,你不能做'fido.findByName',因为'findByName'需要搜索***所有***文档和'fido'只是*** ***文档。 – laggingreflex