Javascript 向mongoose模式动态添加自定义实例方法

Javascript 向mongoose模式动态添加自定义实例方法,javascript,node.js,mongoose,database-schema,Javascript,Node.js,Mongoose,Database Schema,是否有一种方法可以在mongoose模式已经“导出”后添加到该模式 例如,如果我有一个模式: module.exports = function(app, db, config) { var MySchema = new Schema({ name: String }); MySchema.methods.doIt = function() { console.log("I DID IT!"); } db.model("MySchema", MySchema); } 然后,我想在

是否有一种方法可以在mongoose模式已经“导出”后添加到该模式

例如,如果我有一个模式:

module.exports = function(app, db, config) {

  var MySchema = new Schema({ name: String });
  MySchema.methods.doIt = function() { console.log("I DID IT!"); }
  db.model("MySchema", MySchema);
}
然后,我想在模式加载到mongoose模型对象之后,动态地向模式添加新方法

MySchema = db.model('MySchema');
var obj = new MySchema({name: "robocop"});

var myNewMethod = function() { console.log(this.name); }

// Do Magic here to add the myNewMethod to object.

obj.myNewMethod();

你试过了吗?

我已经尝试将其添加到mongoose模型对象,但是这会产生错误,表示模式对象没有我刚才添加的方法

MySchema = db.model('MySchema');
MySchema.schema.methods.myNewMethod = function() { console.log(this.name); }
db.model('MySchema', MySchema);

console.log(MySchema.schema.methods); // This shows my method was added!

...

var obj = new MySchema({name: "robocop"});
obj.myNewMethod(); //ERROR:  YOUR METHOD DOESN'T EXIST!

警告编码员。这是可能的,这是否是一个好主意留给读者作为练习

当然,模式受模式对象的影响,而不是模型的任何特定实例。因此,如果您想要修改模式,您需要访问模式本身

下面是一个例子:

var mongoose = require('mongoose')
  , db       = mongoose.connect("mongodb://localhost/sandbox_development")

var schema = new mongoose.Schema({
  blurb: String
})

var model = mongoose.model('thing', schema)

var instance = new model({blurb: 'this is an instance!'})

instance.save(function(err) {
  if (err) console.log("problem saving instance")

  schema.add({other:  String})  // teh secretz

  var otherInstance = new model({blurb: 'and I am dynamic', other: 'i am new!'})
  otherInstance.save(function(err) {
    if (err) console.log("problem saving other instance", err)

    process.exit(0)
  })
})
注意调用
schema.add
which

我见过这个方法,但是我的印象是,它只向schema对象添加属性,而不向schema对象添加方法。