1. Delete Video
- 삭제는 template, controller, router 모두 사용해야 됨
- findOneAndDelete와 findOneAndRemove의 차이
- mongoose api에도 나와있지만 웬만하면 findOneAndDelete를 사용하면 된다고 나와있음
- 근데 findByIdAndDelete는 findOneAndDelete({ _id: id })를 줄인 것이므로 findByIdAndDelete 사용
- https://github.com/Daniel-Jeon/wetube-loaded/commit/79eb465f1ee8d6347536ca6c4e444c0b310ad2a9
2. Search Video(1)
- 이제 업로드된 신규 영상을 상단으로 올릴 거임
- createdAt을 이용하여 업로드가 된 시간을 가지고 내림차순으로 정렬하면 됨
- mongoose는 꽤 훌륭한 query engine을 가자고 있음
// videoController.js
export const home = async (req, res) => {
const videos = await Video.find({}).sort({ createdAt: "desc" });
return res.render("home", { pageTitle: "Home", videos });
};
- 하지만 지금부턴 검색전용 페이지를 만들거임
- 이제 기본적인 코드는 안올릴거임
console.log(req.query);
{ keyword: "ss" }
- search 페이지에서 검색해보면 parameter가 ? 뒤에 붙어있는걸 알 수 있음
- 그동안 우리가 업로드된 영상을 클릭하면 /videos/:id를 통해 req.params로 id를 알 수 있었음
- 그동안 우리가 form을 보내면 req.body를 통해 object의 값을 알 수 있었음
- express를 사용하여 우리는 굉장히 편리해짐
2. Search Video(2)
- 이제 mongoose와 mongoDB를 사용하기 위해 async와 await을 사용
export const search = async (req, res) => {
const { keyword } = req.query;
if (keyword) {
const videos = await Video.find({
title: keyword,
});
return res.render("search", { pageTitle: "Search", videos });
}
return res.render("search", { pageTitle: "Search" });
};
- find({})에서 우린 아무거나 다 검색을 할 수 있음
- keyword와 title이 동일한 것이 있는지 검색
- 하지만 지금 상태가 아주 별로고 이렇게 하면 조건문 아래의 return에는 videos object를 보낼 수 없음
- keyword과 없다면 videos도 존재할 수 없음
export const search = async (req, res) => {
const { keyword } = req.query;
let videos = [];
if (keyword) {
videos = await Video.find({
title: keyword,
});
}
return res.render("search", { pageTitle: "Search" });
};
- 비어있는 array를 하나 만들고, videos를 새로 정의하는 것이 아닌 바깥에서 정의된 videos를 업데이트만 하는 방법
- search에 있으면 template에서는 videos가 비어있음
- 검색이 되고 keyword가 넘어와서 데이터가 있으면 videos는 업데이트 됨
extends base
include mixins/video
block content
form
input(placeholder="Search Videos", name="keyword", type="text")
input(type="submit", value="Search")
each video in videos
+video(video)
- 현재로서는 영상의 title에 정확히 맞는 keyword가 와야만 검색 가능하므로 이제 정규식을 사용
3. Search with Regex
- Regex i and g
- i는 대소문자 구분없이(ignore case), g는 Global
- welcome으로 끝나는 것만 검색하고 싶다면 /welcome$
- welcome으로 시작하는 것만 검색하고 싶다면 /^welcome
- 우리는 이런 regex을 query에 포함시킬 수 있음
export const search = async (req, res) => {
const { keyword } = req.query;
let videos = [];
if (keyword) {
videos = await Video.find({
title: {
$regex: new RegExp(keyword, "i"),
},
});
}
return res.render("search", { pageTitle: "Search", videos });
};
- 우리가 이렇게 regular expression안에 keyword를 넣으면, 우리는 contain 방식의 regular expression을 생성
- 이렇게 하면 검색이 잘됨
title: {
$regex: new RegExp(`^${keyword}`, "i"),
},
- 이렇게 하면 맨 앞에서 검색된 내용이 있는지 찾을 수 있음
- regex는 mongoose가 아닌 mongoDB가 하는거임
'개발 > Node.js' 카테고리의 다른 글
User Authentication / Hash (0) | 2024.11.07 |
---|---|
User Model (0) | 2024.11.07 |
Mongoose Middleware(2) (0) | 2024.11.04 |
Mongoose Middleware(1) (0) | 2024.11.04 |
Edit Video (0) | 2024.11.04 |