Estoy usando typegoose y type-graphql. Tengo un CommentModel que tiene un campo parentId que almacena ObjectId de su comentario principal.
¿Qué quiero?
Quiero automatizar la eliminación de los padres mediante el uso de pre -middleware. significa que cuando elimino un comentario, quiero que elimine todos los comentarios que su parentId es igual a la identificación del comentario específico.
Un ejemplo:
Entonces, cuando elimine el comentario 2, espero que el comentario 1 también se elimine.
comment: [ { _id: 1, parentId: 2 }, { _id: 2, parentId: null } ]pero no puedo
¿Qué hice?
este es mi software intermedio:
@pre(/remove|delete/i, async function () { await CommentModel.deleteMany({ parentId: this._id }) }) export class Comment { ... } export const CommentModel = getModelForClass(Comment)Y así es como borro
await CommentModel.findByIdAndDelete(ID_OF_COMMENT)esta operación NUNCA terminará. y siempre muéstrame la ruleta de carga. ¿Que sugieres? ¿Lo estoy haciendo mal? o hay un mejor enfoque?
cada middelware tiene una función siguiente para continuar cambiándolo de esta manera:
@pre(/remove|delete/i, async function (next) { await CommentModel.deleteMany({ parentId: this._id }) next(); })Así es como lo arreglé:
@post(/remove|delete/i, async function (comment: DocumentType<Comment> | null) { if (comment?._id) { const children = await CommentModel.find({ parentId: comment._id }).lean().exec() await CommentModel.deleteMany({ parentId: comment._id }) if (children) { await Promise.all(children.map(child => child?._id && CommentModel.deleteMany({ parentId: child._id }))) } } })