반응형
두 테이블간 연관된 데이터를 모두 삭제하는 기능을 추가하고 싶었다.
다른 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"
반응형
'Programming > Node.js' 카테고리의 다른 글
[NestJS] AWS DB Tunneling With Mysql Setting (터널링 및 Mysql 설정) (2) | 2024.11.24 |
---|---|
[MongoDB] 랜섬웨어 (READ__ME_TO_RECOVER_YOUR_DATA) (0) | 2024.04.06 |
[Node.js/AdminBro] Admin Page panel + MongoDB (0) | 2021.10.27 |
[Node.js] Oracle DB 연결하기 (0) | 2021.08.26 |
[Node.js] 간단히 서버 만들기 (0) | 2021.08.26 |