I need to know modified fields or if a specific field was modified in pre or post update hook in a Mongoose schema. I tried the following, but still unable to figure it out:
schema.post('update', function (doc) {
//check modified fields or if the name field was modified and then update doc
});
I know maybe there is a method isModified like in pre save but I don't know how to do the same with update hooks. Any suggestions will be appreciated.
Sponsor #native_company# — #native_desc# Middleware (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. Middleware is specified on the schema level and is useful for writing plugins.
The value of the $in operator is an array that contains few values. The document will be matched where the value of the breed field matches any one of the values inside the array.
Mongoose | updateOne() Function The updateOne() function is used to update the first document that matches the condition. This function is the same as update(), except it does not support the multi or overwrite options.
Pre- and post-execution hooks are Processing scripts that run before and after actual data processing is performed. This can be used to automate tasks that should be performed whenever an algorithm is executed.
try it:
schema.post('update', function () {
const modifiedFields = this.getUpdate().$set;
// ...
});
If you want to know what fields you are modifying, then you need to issue an update command by calling save
:
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);
});
});
This way pre-save hook will be invoked and you will be having access to:
Document.prototype.modifiedPaths()
because this
in pre-save hook refers to the document:
TankSchema.pre('save', function (next) {
// ...
this.modifiedPaths();
// ...
});
On the other hand, you will not be able to achieve the same result when issuing an update command by calling update
:
Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);
because when calling update
, document hooks (e.g. pre-save, post-save) are not being executed at all. Instead, query hooks are being executed (e.g. pre-update, post-update) in that case. And the issue with query hooks is that this
inside of them does not reference the document, so this.modifiedPaths === undefined
schema.post('update', function (doc) {
// `this` refers to model.Query
// `doc` refers to CommandResult
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With