简体   繁体   中英

Delete related records using pre middleware in mongoose

I have 3 schemas including:

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?

My mongoose version: ^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:)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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