简体   繁体   English

mongoose中使用pre中间件删除相关记录

[英]Delete related records using pre middleware in mongoose

I have 3 schemas including:我有 3 个模式,包括:

Building建造

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

Room房间

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

Agreement协议

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

My scenario is after deleting a building then我的情况是在删除建筑物之后

  • All rooms related to building所有与建筑相关的房间
  • All agreements related to room所有与房间相关的协议

will be deleted too, currently I know how to delete rooms related to building:也将被删除,目前我知道如何删除与建筑物相关的房间:

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

So how I can do it using pre middleware?那么我如何使用pre中间件来做到这一点?

My mongoose version: ^6.0.12我的 mongoose 版本: ^6.0.12

Thank you!谢谢!

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

remember remove the building using building.remove() mongoose base function:)记得使用 building.remove() mongoose base function 移除建筑物:)

This is my solution.这是我的解决方案。

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
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM