删除Office时如何同步移除Department中的关联Office ID?
删除Office后Department的offices数组未移除已删除ID的问题
项目技术栈
- Mongoose
- Express
- Vue
相关代码
Department.model.js
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const Department = new Schema({ departmentName: { type: String, required: true, }, text1: { type: String, required: false, }, text2: { type: String, required: false, }, text3: { type: String, required: false, }, offices: [ { type: Schema.Types.ObjectId, ref: "Office", }, ], employees: [ { type: Schema.Types.ObjectId, ref: "Employees", // 关联模型名称 required: true, }, ], }); const departmentModel = mongoose.model("Departments", Department); module.exports = departmentModel;
Office.model.js
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const Office = new Schema({ officeNumber: { type: String, required: true, }, officeName: { type: String, required: true, }, text1: { type: String, required: false, }, text2: { type: String, required: false, }, text3: { type: String, required: false, }, officeDepartment: { type: Schema.Types.ObjectId, // 类型为ObjectID ref: "Departments", // 关联模型名称 required: true, }, employees: [ { type: Schema.Types.ObjectId, ref: "Employees", // 关联模型名称 required: true, }, ], }); const officeModel = mongoose.model("Offices", Office); module.exports = officeModel;
deleteRecords.js
// 删除记录的函数 const deleteItem = async (Model, id, res) => { try { const deletedItem = await Model.findByIdAndDelete(id); if (!deletedItem) { return res.status(404).json({ error: "记录未找到。" }); } // 从所有Department中移除该Office if (Model.modelName === "Office") { const officeId = deletedItem.offices[0]; // 错误来源:Office模型无offices字段 await Department.updateMany( { offices: officeId }, { $pull: { offices: officeId } } ); } res.status(200).json({ message: "记录已删除" }); } catch (error) { res.status(500).json({ error: "删除记录时出错。" }); } }; // DELETE路由中间件 const deleteHandler = (Model) => async (req, res) => { const { id } = req.params; await deleteItem(Model, id, res); // 必须用await等待函数执行完成 }; // 为模型绑定中间件 const express = require("express"); const Job = require("../models/Job.model"); const Office = require("../models/Office.model"); const Department = require("../models/Department.model"); const router = express.Router(); // 删除Job router.delete("/deleteJob/:id", deleteHandler(Job)); // 删除Department router.delete("/deleteDepartment/:id", deleteHandler(Department)); // 删除Office router.delete("/deleteOffice/:id", deleteHandler(Office)); module.exports = router;
DeleteButton.vue
<template> <q-btn dense unelevated icon="delete" color="red" @click="deleteRecord" ></q-btn> </template> <script> import axios from "axios"; export default { props: { recordId: { type: String, required: true, }, modelName: { type: String, required: true, }, }, methods: { deleteRecord() { axios .delete( `http://localhost:3000/delete${this.modelName}/${this.recordId}` ) .then((response) => { console.log("记录删除成功!", response.data); this.$emit("recordDeleted", this.recordId); }) .catch((error) => { console.error("删除记录出错:", error); }); }, }, }; </script>
当前问题
删除Office后,Department模型的offices数组仍保留已删除的Office ID:
{ "_id": "64b8cdf10a5e94c8275a16b4", "departmentName": "trararara", "offices": [ "64b8cdf90a5e94c8275a16b9", ], "employees": [], "__v": 4 }
期望结果:
{ "_id": "64b8cdf10a5e94c8275a16b4", "departmentName": "trararara", "offices": [ ], "employees": [], "__v": 4 }
问题原因与修复方案
原因
deleteItem函数中获取Office ID的代码错误:Office模型不存在offices字段,该字段属于Department模型,要删除的Office ID应为deletedItem._id。
修复后的deleteRecords.js核心代码
修改deleteItem函数中的Office移除逻辑:
// 删除记录的函数 const deleteItem = async (Model, id, res) => { try { const deletedItem = await Model.findByIdAndDelete(id); if (!deletedItem) { return res.status(404).json({ error: "记录未找到。" }); } // 从所有Department中移除该Office if (Model.modelName === "Office") { const officeId = deletedItem._id; // 直接使用已删除Office的ID await Department.updateMany( { offices: officeId }, { $pull: { offices: officeId } } ); } res.status(200).json({ message: "记录已删除" }); } catch (error) { res.status(500).json({ error: "删除记录时出错。" }); } }; // 其余代码保持不变
可选优化
如果Office与Department是一对一关联,可仅更新该Office绑定的单个Department,效率更高:
if (Model.modelName === "Office") { const officeId = deletedItem._id; await Department.findByIdAndUpdate( deletedItem.officeDepartment, { $pull: { offices: officeId } } ); }
内容的提问来源于stack exchange,提问作者Daniel Tršťanský
相关产品推荐
相关产品推荐

