mongoose - 是否可以在运行时动态添加方法进行建模?

时间:2015-05-15 22:03:12

标签: javascript node.js mongoose

我知道您可以在架构上定义方法和静态

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

但是,在您从架构中创建模型之后,它有可能吗?

var model = mongoose.model(schema);

我试过

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

但它不起作用。

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

2 个答案:

答案 0 :(得分:4)

是的,您可以像对待任何其他javascript类一样为您的mongoose模型添加方法。

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

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

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

请注意,像这样大写javascript类是一个很好的约定,它使读者清楚它是一个应该用new调用的构造函数。

答案 1 :(得分:1)

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

在您的模型定义文件中

//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.
        }
    }
});