【问题标题】:Delete related records using pre middleware in mongoosemongoose中使用pre中间件删除相关记录
【发布时间】:2021-12-06 16:11:10
【问题描述】:

我有 3 个架构,包括:

建筑

const BuildingSchema = mongoose.Schema({
  address: { type: String, required: true },
  numberOfRooms: { type: Number, default: 0 },
});

房间

const RoomSchema = mongoose.Schema({
  roomNumber: { type: Number, required: true, unique: false },
  building: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Building",
    required: true,
    unique: false,
  },
});

协议

const AgreementSchema = mongoose.Schema({
  agreementNumber: { type: Number, unique: true },
  room: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Room",
    required: true,
    unique: false,
  },
});

我的场景是在删除建筑物之后

  • 与建筑相关的所有房间
  • 与房间相关的所有协议

也将被删除,目前我知道如何删除与建筑相关的房间:

BuildingSchema.pre("deleteOne", function (next) {
  Room.deleteMany({ building: this._conditions._id }).exec();
  next();
});

那么我该如何使用pre 中间件呢?

我的猫鼬版:^6.0.12

谢谢!

【问题讨论】:

    标签: javascript mongodb express mongoose


    【解决方案1】:
    BuildingSchema.pre("remove", function (next) {
      Room.deleteMany({ building: this._conditions._id }).exec();
      next();
    });
    

    记得使用 building.remove() mongoose 基础函数移除建筑物:)

    【讨论】:

    • Schema.remove() api 已弃用,因此我改用 deleteOne
    【解决方案2】:

    这是我的解决方案。

    BuildingSchema.pre("deleteOne", async function (next) {
      const buildingId = this._conditions._id;
      await Room.find({ building: buildingId }, (err, rooms) => {
        rooms.map(async (item) => {
          await Agreement.deleteMany({ room: item._id }); // => Delete all Agreements related to Room
        });
      }).clone();
      await Room.deleteMany({ building: buildingId }); // => Delete all Rooms related to Building
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2010-11-10
      • 1970-01-01
      • 2020-07-29
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多