如果你想知道你正在修改哪些字段,那么你需要通过调用save发出一个update命令:
Tank.findById(id, function (err, tank) {
if (err) return handleError(err);
tank.set({ size: 'large' });
tank.save(function (err, updatedTank) {
if (err) return handleError(err);
res.send(updatedTank);
});
});
这样 pre-save 钩子将被调用,您将可以访问:
Document.prototype.modifiedPaths()
因为 pre-save 钩子中的this 引用了文档:
TankSchema.pre('save', function (next) {
// ...
this.modifiedPaths();
// ...
});
另一方面,通过调用update 发出update 命令时,您将无法获得相同的结果:
Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);
因为在调用 update 时,文档挂钩(例如 pre-save、post-save)根本没有被执行。在这种情况下,查询挂钩正在被执行(例如pre-update、post-update)。 查询钩子的问题是它们里面的this没有引用文档,所以this.modifiedPaths === undefined
schema.post('update', function (doc) {
// `this` refers to model.Query
// `doc` refers to CommandResult
});