[MongoDB] 관계설정한 데이터 작성하기

적자생존·2023년 1월 12일
0

Node

목록 보기
15/17

1. 관계설정한 스키마에 상호 글 쓰기

가. 1번 스키마

const firstSchema = new Schema({
	title: {type:String, required:true},
  	creator : {type:mongoose.Types.ObjectId, required:true, ref:"Second"}
})

module.exports = mongoose.model("First", firstSchema)

나. 2번 스키마

const secondSchema = new Schema({
	name : {type:String, required:true},
  	contents : {type:mongoose.Types.ObjectId, required:true, ref:"First"}
})

module.exports = mongoose.model("Second", secondSchema)

스키마가 설정된 데이터에서 상호 연결을 해볼 것이다.

예를 들어 두번째 스키마를 유저라고 가정했을 때 유저가 글을 작성하면 contents에 첫번째 스키마를 이용해 작성한 글이 등록되도록 할 것이다.

2. 구현하기

다음과 같이 구현할 예정이고 에러나 검증 부분은 제외하고 작성해보겠다.

const Contents = require("/첫번째스키마경로")
const User = require("/두번째스키마경로")
const createContents = async(req, res, next) => {
	const {title, place} = req.body
    const createdContents = new Contents({
    title,
    creator
    })
    
    let user
    try{
    	user = await User.findById(creator)
    } catch(err){에러}
  try{
  const sess = await mongoose.startSession()
  sess.startTransaction()
    await createdContents.save({session:sess})
    user.contents.push(createdContents)
    await user.save({session:sess})
    await sess.commitTransaction()
  } catch(err){에러}
  
  res.status(201).json({createdContents})
}

다음과 같이 작성하면 글이 작성될 경우 유저 스키마의 contents에 들어가게 된다.

코드를 설명하면

user를 먼저 req.body에 제공되는대로 찾아주고 이 찾은 유저 값을 기억하고 있는다.

우선 트랜잭션이라는 것을 알아야 하는데

“Transaction”은 복수개의 작업들을 “고립”된 상태로 진행하게 해줍니다. 쉽게 말하면, 복수개의 작업이 모두 성공했을 때만 성공하게 되고, 그중 하나라도 실패하게 되면 모두가 실패하게 됩니다. 만약 실패하게 된다면 transaction 작업 전의 상태로 되돌아가게 됩니다.( rollback)

트랜잭션이라고 한다.

즉 a절차, b절차, c절차를 모두 성공했을 때만 성공이라고 판단해주는 역할을 한다.

여기서 트랜잭션을 시작하기 위해서 세션을 열어주고 startSession

밑의 코드를 작성하면 된다.

아직은 잘 모르겠다 나도,,,ㅎㅎ

profile
적는 자만이 생존한다.

0개의 댓글