MongoDB를 사용하여 android Pagination 구현
현재 진행중인 프로젝트는 SNS기반의 앱 이라서 NoSQL을 사용하였고, 메인피드에서 게시글들을 보여주기 위해서 pagination을 사용해야했다. 오늘 작업한 내용을 까먹지 않기 위해 본 글을 작성한다.
먼저 서버(node.js) 코드부터 설명하겠다.
router.get('/:page', async (req, res, next) => {
const offset = 6;
const posts = await Post.find({}, {})
.sort({
update_time: -1,
})
.skip(req.params.page * offset)
.limit(offset);
const retval = {
data: posts,
};
res.status(200).send(retval);
});
해당하는 API는 "http://localhost:3000/post" APP에서 해당 API로 GET 요청을 보냈을 때 동작하는 라우터이다.
Post.find().sort().skip().limit() 의 형태를 띈다. 하나 씩 상세히 설명하겠다.
1. cursor.find()
- db.Post.find({}, {})
-> 기본 형으로, 모든 도큐먼트를 조회한다.
-> " {},{} " 는 생략해도 된다.
-> 첫 번째 파라미터는 query, 두 번째 파라미터는 projection이다.
-> query는 조회 기준을 정한다 / projection은 조회할 때 보여질 필드를 정해준다.
- db.Post.find({"_id":"testman"})
-> _id 필드 값이 "testman"인 것들을 조회한다.
- db.Post.find({},{"_id":false,"title":true})
-> Post의 title만 조회한다.
2. cursor.sort()
- .sort{ KEY: value}
-> 기본형으로 KEY는 데이터의 field이고, value는 1 또는 -1이다.
-> 1은 오름차순, -1은 내림차순이다.
-> KEY는 여러개 입력할 수 있고, 먼저 입력한 KEY가 우선권을 갖는다.
-> 위 코드에서는 "update_time"이라는 field를 기준으로 내림차순 정렬한다. (최신 글 순서로 보여주기 위함)
3. cursor.skip()
- .skip(value)
-> value에 값 개수 만큼 데이터를 생략하고 그 다음부터 출력한다.
4. cursor.limit(value)
- .limit(value)
-> value에 값 개수 만큼 데이터를 출력한다.
위의 코드를 보면, offset에는 6이라는 값을 넣어주었다. 또한 "page"를 APP에서 파라미터로 받아온다. 이 "page"는 게시글로 치자면 몇번 째 페이지 인지와 같은 의미를 가진다.
limit(offset)을 하여서 한 페이지. 즉 요청 한번에 6개의 데이터를 보내준다.
skip(page * offset)을 함으로써, APP에서 요청한 페이지 이전 것들은 전부 건너뛰게 된다.
APP에서 차례로 page를 늘려서 요청하면, 이것이 곧 pagination이 된다.
참고링크
1. find() 메소드
[MongoDB] 강좌 3편 Document Query(조회) – find() 메소드 | VELOPERT.LOG
이번 강좌에선 Document를 조회하는 메소드인 find() 메소드를 자세히 알아보도록 하겠습니다. Document 조회: db.COLLECTION_NAME.find(query, projection) 이 메소드에서 사용되는 매개변수에 대하여 알아봅시다
velopert.com
pro-self-studier.tistory.com/59
2. 검색하고자 하는 Document 를 조회하는 find() 메소드
안녕하세요, 프로독학러 입니다. 이번 포스팅에서는 Document 를 검색하는 find() 메소드에 대해서 자세히 알아보도록 하겠습니다. Document 를 조회하는 find() 메소드 find() 메소드의 표현식은 다음과
pro-self-studier.tistory.com
2. find() 메소드 활용 - sort(), limit(), skip()
[MongoDB] 강좌 4편 find() 메소드 활용 – sort(), limit(), skip() | VELOPERT.LOG
이번 강좌에선 find() 메소드를 더욱 더 활용하기 위해 필요한 sort(), limit(), skip() 메소드에 대해 배워보겠습니다. 그냥 find() 메소드를 사용하면 criteria 에 일치하는 모든 document 들을 출력해주기
velopert.com