12-1. like / unlike 모델 메소드 만들기
좋아요, 그리고 좋아요 취소 할 때 사용되는 메소드 like 과 unlike 를 구현해보도록 하겠습니다.
src/models/post.js
(...)
Post.statics.like = function({_id, username}) {
return this.findByIdAndUpdate(_id, {
$inc: { likesCount: 1 }, // likesCount 를 1 더하고
$push: { likes: username }
}, {
new: true, // 이걸 해야 업데이트 된 데이터를 반환함
select: 'likesCount'
}).exec();
};
Post.statics.unlike = function({_id, username}) {
return this.findByIdAndUpdate(_id, {
$inc: { likesCount: -1 },
$pull: { likes: username }
}, {
new: true,
select: 'likesCount'
});
};
module.exports = mongoose.model('Post', Post);
like 와 unlike 는 작동방식은 서로 비슷합니다. 좋아요를 할 때는 likesCount 를 1을 더하고, 그리고 likes 배열에 주어진 유저네임을 삽입합니다. 반대로 unlike 의 경우엔 likesCount 에서 1을 빼고, likes 배열에서 주어진 유저네임을 제거해줍니다.
그리고 공통적으로, 업데이트의 두번째 옵션 파라미터에서는 { new: true, select: 'likesCount'}
가 설정되었는데, new
의 경우 해당 업데이트의 쿼리 결과가 업데이트 된 다음의 데이터를 반환하도록 설정하는 것이고, select
는 데이터를 불러올 때 likesCount
값만 불러오는 것 입니다.