Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

document.deleteOne() does not trigger the post hook of deleteOne middleware #13669

Closed
vkarpov15 opened this issue Jul 28, 2023 Discussed in #13624 · 0 comments · Fixed by #13707
Closed

document.deleteOne() does not trigger the post hook of deleteOne middleware #13669

vkarpov15 opened this issue Jul 28, 2023 Discussed in #13624 · 0 comments · Fixed by #13707
Milestone

Comments

@vkarpov15
Copy link
Collaborator

Discussed in #13624

Originally posted by mrdulin July 19, 2023
From the middleware documentation:

Note: Unlike schema.pre('remove'), Mongoose registers updateOne and deleteOne middleware on Query#updateOne() and Query#deleteOne() by default. This means that both doc.updateOne() and Model.updateOne() trigger updateOne hooks, but this refers to a query, not a document. To register updateOne or deleteOne middleware as document middleware, use schema.pre('updateOne', { document: true, query: false }).

So I think doc.deleteOne() and Model.deleteOne() will trigger the deleteOne hook. But doc.deleteOne() does not trigger the deleteOne hook.

For example:

import mongoose from 'mongoose';
import { config } from '../../config';

mongoose.set('debug', true);
console.log(mongoose.version);

const reviewSchema = new mongoose.Schema({});
reviewSchema.post('deleteOne', function () {
	console.log('post deleteOne');
});
reviewSchema.post('updateOne', function () {
	console.log('post updateOne');
});
const Review = mongoose.model('Review', reviewSchema);

(async function main() {
	try {
		await mongoose.connect(config.MONGODB_URI);
		// seed
		const [r1] = await Review.create([{}, {}]);
		// test
		// updateOne
		await r1?.updateOne({ name: 'teresa teng' }); // works
		await Review.updateOne({ _id: r1?._id }, { name: 'teresa teng' }); // works

		// deleteOne
		await Review.deleteOne({ _id: r1?._id }); // works
		await r1?.deleteOne(); // doesn't work
	} catch (error) {
		console.error(error);
	} finally {
		await mongoose.connection.close();
	}
})();

Logs:

7.4.0
Mongoose: reviews.insertOne({ _id: ObjectId("64b771cc02ca30b633518b8e"), __v: 0 }, {})
Mongoose: reviews.insertOne({ _id: ObjectId("64b771cc02ca30b633518b8f"), __v: 0 }, {})
post updateOne
post updateOne
Mongoose: reviews.deleteOne({ _id: ObjectId("64b771cc02ca30b633518b8e") }, {})
post deleteOne
Mongoose: reviews.deleteOne({ _id: ObjectId("64b771cc02ca30b633518b8e") }, { session: null })

Is this a bug or am I missing something?

@vkarpov15 vkarpov15 added this to the 7.4.3 milestone Jul 28, 2023
vkarpov15 added a commit that referenced this issue Aug 8, 2023
vkarpov15 added a commit that referenced this issue Aug 8, 2023
docs(middleware): clarify that `doc.deleteOne()` doesn't run query middleware currently
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant