<MongoDB> populate

김민석·2021년 1월 20일
1

YouTube clone

목록 보기
43/54

이번 시간에는 video를 업로드할때 uploader(user) 정보도 포함하도록 수정해보겠습니다.

database 삭제

변경에 앞서 비디오를 업로드 하면서 creator가 추가되므로 기존에 저장된 video를 삭제해줍니다.
%mongo
%use youtube(데이터베이스명)
%db.videos.remove({})
WriteResult({ "nRemoved" : 삭제된 숫자 })가 나오면 성공

project

youtube
  |controllers
   *|videoController.js
  |views
    |mixins
     *|videoBlock.pug
    |pages
     *|home.pug

videoController.js

  • postUpload
    postUpload함수에서는 새로운 Video element를 생성할때 creator 정보를 추가해줬습니다. 또한 creator(User)에게도 videos 배열에 현재 생성한 newVideo의 id를 추가해줬습니다. user.save()도 꼭해주세요.
  • home
    home 페이지에서 creator 정보도 같이 띄우고 싶은데요. video에 담긴 creator 정보는 user objectId 뿐이죠. objectid를 이용해서 user 객체를 따로 불러올 수도 있지만 video를 불러올때 creator 정보도 함께 불러올 수 있습니다.
    populate라는 method를 사용하는데요. populate는 type이 objectId인 경우에만 사용할 수 있습니다. populate는 model에 참조된 모델을 실제 객체로 치환해줍니다. 현재 video element는 creator에 user id를 참조해서 담고 있는데요. populate('creator')를 붙여주면 현재 video 객체에 담긴 creator 정보가 id가 아니라 id에 해당하는 실제 User 정보로 치환되는거죠.
export const postUpload = async (req, res) => {
    const {body:{title, description}, file:{path}} = req;
    const newVideo = await Video.create({
        fileUrl: `${path}.mp4`,
        title,
        description,
        creator: req.user.id
    })
    
    cosnt user = await User.findById(req.user.id);
    user.videos.push(newVideo.id);
    user.save();
  
    res.redirect(`${routes.videoDetail(newVideo.id)}`);
}

export const home = async (req, res) => {
    try{
        // 여러 element를 불러올때도 populate 사용 가능
        const videos = await Video.find({}).populate('creator');
        res.render('home', { pageTitle: 'title', videos });
    }
    catch(e) {
        console.log(e);
        res.render('home', { pageTitle: 'home', videos: [] });
    }
}

home.pug

videoBlock에 creatorName을 전달해주기위해 코드를 추가해줍니다.

extends layouts/main
include mixins/videoBlock

block content
    .videos
        each item in videos
            +videoBlock({
                id:item.id,
                title:item.title,
                views:item.views,
                videoFile:item.fileUrl,
                creatorName: item.creator
            })

videoBlock.pug

원하는 탬플릿에 비디오 업로더명을 추가해봅니다.

mixin videoBlock(video = {})
    .videoBlock
        a(href=routes.videoDetail(video.id))
            video.videoBlock__thumbnail(src=`/${video.videoFile}`, type="video/mp4")
            .description
                .desciption__user
                    .user__avatar
                      i.fas.fa-user-alt
                    .user__name
                      |video.creatorName
                .description__text
                  h4.videoBlock__title=video.title
                  h6.videoBlock__views 조회수 #{video.views}회
profile
누구나 실수 할 수 있다고 생각합니다. 다만 저는 같은 실수를 반복하는 사람이 되고 싶지 않습니다. 같은 실수를 반복하지 않기 위해 기록하여 기억합니다.🙃

0개의 댓글