[MongoDB] Mongoose(몽구스) findByIdAndUpdate, findOneAndUpdate 사용해서 documents field 값 업데이트하기


Video.js(model)

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const videoSchema = mongoose.Schema(
{
writer: {
type: Schema.Types.ObjectId,
ref: "User",
},
nickname: {
type: String,
},
title: {
type: String,
maxlength: 50,
},
description: {
type: String,
},
genre: {
type: String,
},
cost: {
type: Number,
},
filePath: {
type: String,
},
views: {
type: Number,
default: 0,
},
duration: {
type: String,
},
thumbnail: {
type: String,
},
preview: {
type: String,
},
likes: {
type: Number,
default: 0,
},
},
{ timestamps: true }
);

const Video = mongoose.model("Video", videoSchema);

module.exports = { Video };

routes/video.js (router)


Video.findByIdAndUpdate(
{ _id: req.body.videoId },
{ $inc: { likes: 1 } },
{ new: true }
).exec((err, result) => {
if (err) return res.status(400).json({ success: false, err });
res.status(200).json({ success: true });
});


내가 하고자하는것은 특정 영상의 좋아요 수를 업데이트 시켜주는것이다.

documents의 고유한 값인 ObjdectId를 사용하면 findByIdAndUpdate, findOneAndUpdate 메서드 둘 중 하나의 메서드를 사용해서 좋아요 수를 업데이트 시켜줄 수 있다.

Video는 video가 저장되어있는 모델 스키마를 가리키는것이다.

첫번째 인자로는 찾고자하는 documents의 ObjectId 를 client로 부터 전달받아서 값을 넣어줘서 해당 영상을 찾도록하고

두번째 인자로는 해당 영상의 좋아요 숫자를 증가 시키고자 $inc 를 작성해주고 원하는 스키마 모델의 값을 어떻게 해줄지 작성한다. $inc가 값을 증가 시키는 것이므로 { likes : likes + 1 } 이렇게 작성하지 않아도 좋아요의 숫자는 +1이 된다.

세번째 인자는 옵션이다. 옵션은 필수는 아니다.

내가 작성한 옵션은 { new : true } 인데 해당 옵션을 작성하면 업데이트 된 결과값을 return값으로 받을 수 있다. 만약에 옵션을 작성하지 않으면 업데이트하기 이전의 결과값을 return값으로 받게된다.



댓글