Mongoose 페이징 처리 (Node)
2021. 2. 24. 17:44ㆍMongoDB, Mongoose
몽구스를 이용하여 페이징 처리 방법
post라는 모델에 있는 게시물을 페이징 처리
- 모델
//모델
const Post = require('../models/post')
- 프론트 요청값
// 프론트에서 요청하는 페이지번호, 요청하는 최대 게시물 숫자
//해당 페이지 번호
const page = req.params.page
//최대 요청 수
const maxPost = req.params.maxPost
- 페이징 함수
const paging = (page, totalPost, maxPost) => {
// 페이지에 나오는 최대 게시물 수
const maxPost = maxPost
// 페이지에 나오는 최대 페이지 수
const maxPage = maxPost
// 받아오는 page가 스트링일경우 Number형으로 변경하고, 아닐경우 1로 입력
let currentPage = page ? parseInt(page) : 1
// 표시할 게시물이 없을 경우 남은 페이지는 1,
// 게시물이 뒤에 있을경우 page -1 를 하고 maxPost값을 곱한다
const hidePost = page === 1 ? 0 : (page - 1) * maxPost
// 페이징처리해야하는 페이지 수
// Math.ceil은 나머지값이 있으면 올림처리한다.
const totalPage = Math.ceil(totalPost / maxPost)
// url로 직접 접근하는 경우,
// currentPage가 totalPage보다 클 경우 currentPage를 마지막 페이지로 바꿔준다
if (currentPage > totalPage) {
currentPage = totalPage
}
// 화면에 표시할 페이지의 시작 번호를 구한다.
// Math.floor 소수점 이하를 제거
// (현재 페이지 번호 -1 / 최대 페이지 번호) * 최대 페이지 번호 + 1 = 시작 페이지 번호
const startPage = Math.floor(((currentPage - 1) / maxPage)) * maxPage + 1
// 화면에 표시할 페이지의 마지막 번호를 구한다.
// 페이지 시작 번호 + 최대 페이지 번호 - 1
let endPage = startPage + maxPage - 1
// endPage 필요이상을 늘어나는것을 방지
// maxPage === 10, totalPage === 25, statePage === 21 경우
// endPage가 30 되면 정보가 없는 칸이 늘어나기 때문에 방지
if (endPage > totalPage) {
endPage = totalPage
}
return { startPage, endPage, hidePost, maxPost, totalPage, currentPage }
}
- 총 게시물 수
// 총 게시물 수
const totalPost = await Post.countDocuments({})
- 페이징 함수 호출, 요청한 페이지 만큼 검색 후 json으로 전달
//페이징 함수 호출
const { startPage, endPage, hidePost, maxPost, totalPage, currentPage } = paging(page, totalPost, maxPost)
//포스트 검색
const post = await Post.find({})
//name을 기준으로 내림차순, 1일경우 오름차순
.sort({ name: -1 })
//제외할 게시물 hidePost === 10 경우 검색은 11부터 시작
.skip(hidePost)
//게시물 수 maxPost === 3 일경우 3개만 가져옴
.limit(maxPost)
//res.json 전달
res.json({ post, startPage, endPage, hidePost, maxPost, totalPage, currentPage })
- 전체
//모델
const Post = require('../models/post')
//페이징 함수
router.get('/post/:page/:maxPost', async (req, res, next) => {
// 프론트에서 요청하는 페이지번호, 요청하는 최대 게시물 숫자
const page = req.params.page
const maxPost = req.params.maxPost
const paging = (page, totalPost, maxPost) => {
const maxPost = maxPost
const maxPage = maxPost
let currentPage = page ? parseInt(page) : 1
const hidePost = page === 1 ? 0 : (page - 1) * maxPost
const totalPage = Math.ceil(totalPost / maxPost)
if (currentPage > totalPage) {
currentPage = totalPage
}
const startPage = Math.floor(((currentPage - 1) / maxPage)) * maxPage + 1
let endPage = startPage + maxPage - 1
if (endPage > totalPage) {
endPage = totalPage
}
return { startPage, endPage, hidePost, maxPost, totalPage, currentPage }
}
// 총 게시물 수
const totalPost = await Post.countDocuments({ })
//페이징 함수 호출
const {
startPage,
endPage,
hidePost,
maxPost,
totalPage,
currentPage
} = paging(page, totalPost, maxPost)
//포스트 검색
const post = await Post.find({})
.sort({ createAt: -1 })
.skip(hidePost)
.limit(maxPost)
//res.json 전달
res.json({ post, startPage, endPage, hidePost, maxPost, totalPage, currentPage })
})
728x90
반응형
'MongoDB, Mongoose' 카테고리의 다른 글
mongoose options usecreateindex,usefindandmodify are not supported 에러 해결 방법 (0) | 2021.11.04 |
---|---|
Mongoose 필드(field)명 변경, Object 키 값 변경 (0) | 2021.04.22 |
Cosmos DB에 mongoose sort기능 사용시 오류 The index path corresponding to the specified order-by item is excluded (0) | 2020.10.08 |
Moogoose "__v" 필드 (0) | 2020.06.10 |
MongoError: E11000 duplicate key error index (0) | 2020.06.10 |