Using setter in Mongoose

According to mongoose.js doc, it is able to set setters to a field on schema.
However, the doc is not quite detailed and obselete.
Some example:

1
2
3
4
5
6
7
8
9
10
11
var schema=new Schema({
password:{
type:String,
required:true,
set:hash
}
})

function hash(plainPwd){
return require("crypto").createHash("sha1").update(plainPwd).update(secret).digest("hex");
}

The hash will be called mainly on following scenarios:

  • When a new doc being created.

    1
    model.create({password:"12345"}) //password will be hashed
  • When set a value to a doc.

    1
    doc.password="22222" // 22222 will be hashed

However, this will not work for update query:

1
2
3
model.update({_id:<id>},{$set:{password:"12345"}}) // password will not be hashed
model.findOneAndUpdate
model.findAndUpdate

For password, it is able to write beforeUpdateHook

1
2
3
4
5
6
7
8
schema.methods.beforeUpdateHook=function(data){
if (!data || this.password === data.password){
return ;
}
if (data.password){
data.password=hash(data.password);
}
}