몽고 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' 카테고리의 다른 글
Puppeteer.js 를 이용한 웹 자동화 (1) | 2019.07.09 |
---|---|
Parse & Crawling To Node.js (노드로 파싱 및 크롤링하기) (0) | 2019.07.08 |
[Express] 동영상 페이지 제작 (0) | 2019.01.25 |
[Express]Pug mixins (0) | 2019.01.25 |
[Express] Form get (0) | 2019.01.25 |