본문 바로가기

BackEnd/Node.js

[MongoDB] 사용법

몽고 DB는

NOSQL이고

딴 것보다 데이터가 JSON가 같은 포멧인게 가장 큰 장점이라는거 같다.


설치를 하고


db.js

import mongoose from "mongoose";

mongoose.connect(process.env.MONGO_URL, {
useNewUrlParser: true,
useFindAndModify: false
});

const db = mongoose.connection;
db.once("open", handleOpen);


다음과 같이 연결하면 된다.


그리고 서버가 시작되는 곳에


import시켜주자.


이후에 모델을 만들어 관리한다.


import mongoose from "mongoose";
const VideoSchema = new mongoose.Schema({
fileUrl: {
type: String,
required: "File URL is required"
},
title: {
type: String,
required: "Title is required"
},
description: String,
views: {
type: Number,
default: 0
},
createdAt: {
type: Date,
default: Date.now()
},
comments: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}
]
});

const model = mongoose.model("Video", VideoSchema);
export default model;


객체 다루듯이 사용하면 되는데,


마지막 comments같은 경우는 참조되어야 하는 키다.

그래서 comments는 단지 아이디 값이며

Comment를 참조한다고 정의되어 있다.


모델들은 컨트롤러에 전달되어 사용되는데


CRUD순으로 살펴보면


import Video from "../models/Video";
export const postUpload = async (req, res) => {
const {
body: { title, description },
file: { path }
} = req;
const newVideo = await Video.create({
fileUrl: path,
title,
description
});
//To do : Upload and save video
res.redirect(route.videoDetail(newVideo.id));
};


Create

create({ })를 이용한다.


export const videoDetail = async (req, res) => {
const {
params: { id }
} = req;
try {
const video = await Video.findById(id);
res.render("videoDetail", { pageTitle: video.title, video });
} catch (err) {
console.log(err);
res.redirect(route.home);
}
};


export const search = async (req, res) => {
//const searchingBy = req.query.term;
const {
query: { term: searchingBy }
} = req;
let videos = [];
try {
videos = await Video.find({
title: { $regex: searchingBy, $options: "i" }
});
} catch (err) {
console.log(err);
}
res.render("search", {
pageTitle: "Search",
searchingBy,
videos
});
};


Read


여러가지 경우가 있는데

기본적으로 find({ })을 이용하며

추가적으로 findById등등이 있다.


이렇게 찾은 데이터들은 변수에 담아 View에 전달하는 게 일반적


videoDetail.pug

extends layouts/main

block content
.video__player
video(src=`/${video.fileUrl}`)
.video__info
a(href=route.editVideo(video.id)) edit Video
h5.video__title=video.title
span.video__views=video.views
p.video__description=video.description
.video__comments
if video.comments.length === 1
span.video__comment-number 1 comment
else
span.video__comment-number #{video.comments.length} comments


search.pug

extends layouts/main
include mixins/videoBlock

block content
.search__header
h3 Searching for: #{searchingBy}
.search__videos
if videos.length === 0
h5 No Videos Found
each item in videos
+videoBlock({
title : item.title,
views : item.views,
videoFile : item.fileUrl,
id:item.id
})



export const postEditVideo = async (req, res) => {
const {
params: { id },
body: { title, description }
} = req;
try {
await Video.findOneAndUpdate({ _id: id }, { title, description });
res.redirect(route.videoDetail(id));
} catch (error) {
res.redirect(route.home);
}
};


Update


findOneAndUpdate({ })


첫번째 파라미터는 업데이트할 대상의 아이디

두번째는 업데이트할 값이다.


이때 

몽고 DB는 아이디를 저장할떄

_id와 같이 저장함!


export const deleteVideo = async (req, res) => {
const {
params: { id }
} = req;
try {
await Video.findOneAndRemove({ _id: id });
} catch (err) {
console.log(err);
}
res.redirect(route.home);
};


Delete와 동일



'BackEnd > Node.js' 카테고리의 다른 글