mongoose虚拟字段没有更新

我为这样的用户创build了一个架构:

var schema = new Schema({ username: { type: String, unique: true, required: true }, hashedPassword: { type: String, required: true }, salt: { type: String, required: true } }); schema.virtual('password') .set(function(password) { this._plainPassword = password; this.salt = Math.random() + ''; this.hashedPassword = this.encryptPassword(password); }) .get(function() { return this._plainPassword; }); schema.methods.encryptPassword = function(password) { return crypto.createHmac('sha1', this.salt).update(password).digest('hex'); }; 

那么我试图改变密码使用两种方法:

  1. 工作很好

    User.findById('userId ..',function(err,user){user.password ='456'; user.save(cb);})

  2. 为什么这种方法不起作用?

    User.findByIdAndUpdate('userId',{$ set:{password:'456'}},cb)

发生这种情况是因为Mongoose在findByIdAndUpdate()操作中不应用以下任何操作:

  • 默认
  • 制定者
  • validation
  • 中间件

从文档 :

如果您需要这些function,请使用传统方法首先检索文档。

 Model.findById(id, function (err, doc) { if (err) .. doc.name = 'jason borne'; doc.save(callback); }) 

与版本4.0.9 +中间件支持findByIdAndUpdate()

 CustomerSchema.pre('findOneAndUpdate', function(next, done) { console.log("findOneAndUpdate pre middleware!!!"); next(); });