Probé todas las soluciones sobre el desbordamiento de pila que se relacionan con la eliminación de documentos a los que se hace referencia en MongoDB usando node.js. Pero la mayoría de ellos tienen soluciones con métodos obsoletos y algunos de ellos no funcionan en absoluto.
Tengo dos modelos, Parent e Child con una relación one-to-many . El documento principal incluye una matriz de ID de documentos secundarios a los que se hace referencia, como se muestra en el siguiente esquema.
//file => parent.js const parentSchema = new mongoose.Schema({ parentName: { type: String, }, childrens : [ { type: mongoose.Schema.Types.ObjectId, ref: 'Children' } ] }); const Parent = mongoose.model("Parent", parentSchema); module.exports = Parent ; El siguiente archivo tiene un modelo de children con el middleware o gancho childrenSchema.pre() que se activa con éxito:
//file => children.js const mongoose = require("mongoose"); const Parent = require("./parent"); const childrenSchema = new mongoose.Schema({ childrenId: Number, info: String, type: String, }); childrenSchema.pre('findOneAndDelete', async function(next) { console.log('trigger when middleware runs' , this.getQuery()["_id"]) ; const childrenId = new mongoose.Types.ObjectId(this.getQuery()["_id"]) await Parent.updateOne({} , { $pull: { childrens: { _id: childrenId }}}); next() }) const Children = mongoose.model("Children", childrenSchema); module.exports = Children ; Ahora, finalmente esta es la ruta a la que estoy llamando para eliminar la instancia de childrenId . Tengo bastantes errores, pero principalmente dice que Parent.updateOne() no es una función en el archivo anterior. Pero el middleware se activa con éxito cuando se ejecuta la siguiente ruta.
// route which performs delete action and triggers mongoose middleware router.delete('/delete/instance' , async(req,res) => { const childrenId = new mongoose.Types.ObjectId('612cd0d8f9553c9f243db691') const deletedInstance = await Children.findOneAndDelete( { _id: childrenId} ) res.json(deletedInstance) })Tenga en cuenta que está intentando realizar updateOne() sin opción de filtro. Para la lógica en sí, ¿por qué no la pones dentro del enrutador?
const Parent = require("./parent"); router.delete('/delete/instance' , async (req,res) => { await Parent.updateOne({ childrens: '612cd0d8f9553c9f243db691' }, { $pull: { childrens: '612cd0d8f9553c9f243db691' }}) const deletedInstance = await Children.findOneAndDelete({ _id: '612cd0d8f9553c9f243db691'}) res.json(deletedInstance) })