mongoose - 是否可以在运行时动态地向模型添加方法?

mongoose - Is it possible to dynamically add methods to model at runtime?

我知道您可以在模式上定义方法和静态变量

var schema = new mongoose.Schema({});
schema.methods.fn = function(){}

但是在您从架构创建模型后是否可能?

var model = mongoose.model(schema);

我试过了

model.schema.methods.fn2 = function(){};

但它不起作用。

我想在运行时添加某些方法,由于运行时唯一重要的是模型,而不是模式,我想知道您是否可以继续以某种方式动态地向模型的内部模式添加方法?

是的,您可以像添加任何其他模型一样向猫鼬模型添加方法 javascript class。

var Person = mongoose.model('Person', PersonSchema);

Person.prototype.myMethod = function() {
    console.log(this.toString());
}

var bob = new Person({
    name: 'Bob'
});
myModel.myMethod();

请注意,像这样将 javascript classes 大写是一个很好的惯例,它让 reader 清楚地知道它是一个构造函数,应该用 new.

您可以通过在模型对象上创建原型来在任何已注册模型上创建原型。

在您的模型定义文件中

//define your schema
module.exports = mongoose.model('model', schema);

应用中的任何位置

使用 mongoose 对象访问您选择的模型并添加一个方法。如果您愿意,可以将模型名称和函数名称设为变量:

if (!mongoose.models['model']['fn2']) {
    mongoose.models['model'].prototype['fn2'] = function() {
        console.log("Yeah!");
    }
}

完成此函数的原型后,只需对该模型的任何文档调用实例函数即可:

model.findById(someId).exec(function(err, doc) {
    if (doc) {
        if (typeof doc.fn2 === 'function') {
            doc.fn2(); //writes "Yeah!" to the console.
        }
    }
});