티스토리 뷰
📌 2020 07 24
- 전체 상품 중에서 특정 키워드가 title에 들어간 상품 검색 기능 구현
- 몽고 db에서는 searching 기능을 제공해주는데, 먼저 검색의 대상이 되고자 하는 컬렉션 필드를 text index로 등록해줘야 한다. 아래와 같이 등록해주면 된다.
Schema.index({필드명: 'text'});
const mongoose =require('mongoose');
const Schema = mongoose.Schema;
const ProductSchema = new Schema({
title:{
type:String,
required:true
},
price:{
type:Number,
required:true
},
imageUrl:{
type:String,
required:true
},
description:{
type:String,
required:true
},
userId:{
type:Schema.Types.ObjectId,
required:true
}
});
ProductSchema.index({title: 'text'}); // text index로 등록
module.exports=mongoose.model('Product',ProductSchema);
- 이제 사용자가 검색한 키워드를 서버에 받아오기 위해 form 을 만들어주고, method는 GET으로 해주어 해당 키워드를 쿼리로 담아온다.
<form action="/search" method="GET">
<label>title search</label>
<input class ="searchBox" type="text" name="searchWord">
<button class="btn" type="submit">search</button>
</form>
- searchWord 쿼리에 담아온 데이터를 이용해서 Product 스키마에게 search 쿼리를 적용하여 특정 상품만 받아오도록 하자.
Product.find({ $text : {$search: searchWord}})
이렇게 입력해주면 해당하는 product만 가져올 수 있다.
- 추가 : 나는 searching Result 페이지에도 pagination을 구현했기 때문에 부가적인 요소있다.
- searchWord쿼리와 함께 page쿼리에는 page number를 담아왔다.
- 여기서 주의 할점은 아래 예시처럼 쿼리를 두개이상 보낼 때는 각 쿼리들을 '& '으로 연결시키고, 뒤에오는 쿼리문에는 ? 을 붙여선 안된다.
http://localhost:3000/search?searchWord=text&page=1
exports.getSearch=(req,res,next)=>{ // 상품 찾기
const searchWord = req.query.searchWord; // 쿼리에 담아온
console.log(searchWord);
let pageNum=1;
if(req.query.page){ pageNum=+req.query.page; } // 페이지 번호 담아오기
console.log(req.query.page);
let totalItems;
Product.find({ $text : {$search: searchWord}}).countDocuments() // 전체 아이템 수
.then(itemsNum=>{
totalItems=itemsNum;
return Product.find({ $text : {$search: searchWord}})
.skip((pageNum-1)*POST_PER_PAGE) // 앞 페이지 product skip
.limit(POST_PER_PAGE) // 현재 페이지에 와야할 product 수
})
.then(products=>{
res.render('shop/searchingResult', {
pageTitle: 'searching result',
path:'/search?searchWord='+searchWord,
prods: products,
currentPage:pageNum, // 현재 페이지
hasNextPage: POST_PER_PAGE*pageNum < totalItems, // 다음 페이지가 있는가?
hasPreviousPage: pageNum>=2, // 이전 페이지가 있는가?
nextPage: pageNum+1, // 다음페이지
previousPage:pageNum-1, //이전페이지
lastPage: Math.ceil(totalItems/POST_PER_PAGE) //마지막 페이지
})
})
.catch(err =>console.log(err));
}
몽고 db의 serach 기능에 대한 더 많은 정보는 docs.mongodb.com/manual/text-search/ 에 있다!
'Project > 첫번째 프로젝트 쇼핑몰 웹' 카테고리의 다른 글
[ node js - express 쇼핑몰 웹] 6. Cart 와 Order 수량 변경 기능 구현 / Cart 내에서 체크한 항목만 Order하는 기능 구현 (0) | 2020.07.22 |
---|---|
[ node js - express 쇼핑몰 웹] 5. Seller 등록, 취소 구현 (0) | 2020.07.22 |
[ node js - express 쇼핑몰 웹 ] 4. input data validation 추가 (0) | 2020.07.19 |
[node js - express 쇼핑몰 웹] 3. 로그인, 로그아웃, 회원가입 구현하기 (0) | 2020.07.16 |
[node js - express 쇼핑몰 웹] 2. 삭제된 product 정보 cart와 order에 적용시키기 (0) | 2020.07.15 |
댓글