Search code examples
javascriptmongodbexpressmongoose

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!


Solution

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