You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除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ý

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:44:52