[Node.js/mongoose DB] cascade delete 기능 구현하기

Programming/Node.js 2021. 12. 10. 21:44 Posted by 생각하는로뎅
반응형

두 테이블간 연관된 데이터를 모두 삭제하는 기능을 추가하고 싶었다.

 

다른 DB 들은 그런 기능 하나쯤 있는것 같은데, 몽구스 DB는 오브젝트형태로 되어 있어서 그런지, 기능을 직접 구현해줘야했다.

 

목표는 [유저]가 등록한 [여러개의 데이터]를 일괄적으로 삭제하도록 했다.

 

삭제하는 키는 phoneNumber(휴대번호) 로 했다.

 

 

Data 모델과 User 모델로 두개의 테이블이 있다.

 

모델 정보들은 아래와 같다.

 

 

1. Data Model

const mongoose = require('mongoose');
const DataSchema = new mongoose.Schema({
  phoneNumber: {
    type: String,
    required: true
  },
  // 심박
  heartRate: {
    type: Number,
    required: true,
  },
  // 산소포화도
  oxygen: {
    type: Number,
    required: true,
  },
  insertDate: {
    type: Date,
    required: true,
    default: () => Date.now() + 3*60*1000,
  },
})
module.exports = mongoose.model('Data',DataSchema)

 

 

2. User Model

const mongoose = require('mongoose');
const data = require('./Data');

const UserSchema = new mongoose.Schema({
  // 휴대번호
  phoneNumber: {
    type: String,
    required: true,
  },
  // 생년월일
  birthday: {
    type: String,
    required: true,
  },
  // 성별
  sex: {
    type: String,
    required: true,
  },
  // 비밀번호
  password: {
    type: String,
    required: true
  },
  insertDate: {
    type: Date,
    required: true,
    default: () => Date.now() + 3*60*1000,
  },
})

UserSchema.pre('findOneAndRemove', { document: false, query: true }, async function() {
  // 지워지는 자신을 찾는다.
  const doc = await this.model.findOne(this.getFilter())
  // 링크가 되어 있는 키를 맵핑해서 삭제한다.
  await data.deleteMany({ phoneNumber: doc.phoneNumber });
});

module.exports = mongoose.model('User',UserSchema)

 

 

 

기능 구현은 모델 안에서 해결이 가능했다.

 

[유저]가 삭제한 모든 데이터를 삭제해야했기 때문에, User 모델에 기능 코드들이 삽입이 된다.

 

const mongoose = require('mongoose');
const data = require('./Data');

const UserSchema = new mongoose.Schema({
  ....
  ....
  ....
  
  UserSchema.pre('findOneAndRemove', { document: false, query: true }, async function() {
  
  // 지워지는 자신을 찾는다.
  const doc = await this.model.findOne(this.getFilter())
  
  // 링크가 되어 있는 키를 맵핑해서 삭제한다.
  await data.deleteMany({ phoneNumber: doc.phoneNumber });
  
});

module.exports = mongoose.model('User',UserSchema)

 

 

부가적으로 pre와, post가 있으므로, 상황에 맞게 쓰면 된다.

 

또한 필자는 'findOneAndRemove' 라는 것을 사용했지만, 상황에 따라서 아래와 같이 호출되므로 알맞게 골라서 쓰도록 한다.

 

"deleteOne" | "remove" | "update" | "updateOne" | "updateMany" | "deleteMany" | "findOne" | "find" | "distinct" | "findOneAndDelete" | "findOneAndUpdate" | "count" | "findOneAndRemove"

 

 

 

 

 

 

반응형