이 포스팅은 아래의 강의를 참고한 개인 정리본이니 강의를 통해 공부하시는 것을 추천드립니다.
1. boards 안에 users, comments 데이터를 같이 저장하기
1) BoardSchema 정의
BoardSchema 안에 아래처럼 users와 comments를 정의해줌.
comments처럼 CommentSchema를 가져와서 그대로 넣어줄 수도 있음.
(당연히 Comment쪽에서 CommentSchema를 export 해줘야함)
참고) comments를 실제 필드로 정의하였으므로 이전 포스팅에서 작성했던 virtual 관련 코드는 주석처리함.
2) boards 등록 로직 약간의 수정
표시된 부분처럼 user를 그대로 넣어주면 mongoose에서 알아서 정의한 필드만 넣어준다.
3) boards 안에 user 정보가 정의한대로 잘 들어갔는 지 확인
4) Comment 등록 시, Board 데이터 업데이트하기
체크된 부분처럼 comments를 저장하고 그 댓글을 다시 boards에 등록함(수정)
Promise.all 사용 이유 : comments 저장, boards Update 모두 await로 해야하는데 병렬로 하면 더욱 성능에 도움됨
2. comments 수정 시, boards 데이터도 같이 수정되도록 하기
아래의 소스처럼 comments 콜렉션을 업데이트 해주고, boards 콜렉션 부분에도 Update를 해준다.
잘 보면 큰 따옴표로 표현 한 것을 알 수 있으며 $ 는 앞에 있는 조건에 해당되는 하나의 데이터라는 뜻이다.
수정 전)
수정)
수정 후)
3. User 수정 시, Board 데이터도 같이 수정되도록 하기
users 수정 시, boards와 comments도 같이 수정되도록 하는 부분은 위의 Comment와 비슷하다.
단지, boards와 comments에서 updateOne이 아니라, updateMany를 사용하면 된다.
수정 전)
수정)
수정 후)
4. comment 삭제 시, boards 콜렉션에서도 빼주기
update 에서 $pull 을 이용해서 배열의 데이터를 삭제할 수 있다.
수정 전)
수정)
수정 후)
5. users 콜렉션의 유저 삭제 시, boards와 comments 콜렉션에서도 삭제하기
위의 방법과 같은 방식으로 코딩하면 된다.
결과 캡처 생략.
* 콜렉션의 내장으로 설정 vs 개별적으로 설정해서 그 때 그 때 불러오기
- 내장으로 설정하는 경우
1) 같이 불러올 때가 많은 경우
2) CRUD 중 읽기를 많이 하는 경우
- 개별적으로 설정하는 경우
1) 개별적으로 데이터를 불러올 때가 있는 경우
2) 내장하려는 문서가 자주 변경되는 경우
추가로, 1:N 관계에서 N의 수에 따라서도 어느 방향으로 데이터구조를 설계할 지 생각할 수 있다.
예시)
- N<100 : 내장
- 100<N<1000 : 부분(_id만) 내장. (별도의 인덱스 없이 빠른 탐색을 위함)
- 1000<N : 관계
'DB > MongoDB' 카테고리의 다른 글
[MongoDB 기초부터 실무까지] 10. Transaction (0) | 2022.08.23 |
---|---|
[MongoDB 기초부터 실무까지] 9. Index, Paging(skip, limit) (0) | 2022.08.22 |
[MongoDB 기초부터 실무까지] 7. 임시 데이터 생성 및 axios 사용해보기 (0) | 2022.08.13 |
[MongoDB 기초부터 실무까지] 6. Board API 만들기 및 라우터 안에 라우터 파라미터 사용 방법 (0) | 2022.08.05 |
[MongoDB 기초부터 실무까지] 5. Node.js로 MongoDB 접근해보기 (0) | 2022.08.01 |