nodeJS

관련있는 Object를 서로 연결시켜주기. populate() - 2

변기원 2022. 2. 16. 13:17

이번에는 user model에 다수의 video object를 연결시켜보자

userSchema에 객체가 여러개 들어간 배열을 만들자.

videos array에 들어가는 객체의 id는 video model을 참고한다. 나중에 저 배열 안에 video model object가 쭉쭉 들어갈것이다.

그럼 이제 어디로 갈까? 이번에도 video 가 upload될때 user에 video id를 추가해야되니까. postUpload controller로 가보자!

아까 여기까지 만들어놨다. 이제 지금 세션의 user를 찾아서 그 user의 videos에 방금만든 video model의 id를 추가해보자

다행인 것은 Video.create()가 방금만든 video객체를 return 한다는 것이다. 그래서 const newVideo로 변수를 받을 수 있다. 

그리고 db에서 지금 세션의 유저id로 user를 찾아내고, 그 user의 videos 에 newVideo._id를 push해준다.(배열이니까 puch로 넣어준다.) 그리고 user.save()를 하면 저장까지 완료된다. 

 

이제 아까 했던것의 반복이다. 필요한 곳에서 populate("videos")를 해주면 user에 연결된 video object를 불러올 수 있다. 

노마드코더님의 강의에서는 user의 프로필에 해당 유저가 올린 video들을 쫙 출력해줬다. 인스타그램 피드처럼?

 const user = await User.findById(id).populate("videos")로 입력해서 user를 template에 보냈다.

user에서도 해당 user가 올린 videos 의 object를 전부 확인 가능하다.

profile.pug 에서 mixin을 써서 영상을 불러올텐데, 배열의 이름만 user.videos로 바꿔주면 정상적으로 출력이 될 것이다. 

 

populate를 이해하는데 상당한 시간이 소요되었다. 알고있으면 굉장히 편하게 코드를 쓸 수 있다고 생각했기 때문에 꼭 이해하려고 노력했다. 단 populate는 db를 직접 건드리는게 아니라 단지 javascript상에서만 연동되어 사용할 수 있는 것이다. db에는 여전히 objectid만 저장되어 있다.