오늘은 진행하는 프로젝트에서 데이터를 조회하는 부분을 구현하였다.
dog_poo 테이블에서 최신순으로 정렬한 후 "RGB"값을 두개 씩 보내주는 것이 목표였다.
어떻게 구현해야 할지 찾아보던 중 "pagination" 이라는 것이 있어서 사용하였고, 이를 기록으로 남긴다.
const readPooData = async (req, res, next) => {
const pooData = req.query;
const Op = Sequelize.Op;
var startDate = new Date(pooData.date);
var endDate = new Date(pooData.date);
endDate.setDate(endDate.getDate()+1);
try {
const result = await db.dog_poo.findAll({
attributes: [
"RGB", "createdAt"
],
where: {
user_dog_id: req.currentUser.uid,
createdAt: {
[Op.gt]: startDate,
[Op.lt]: endDate
},
},
order: [
["createdAt", "DESC"]
],
limit: 2,
offset: pooData.page * 2,
})
res.json(result);
Data 객체를 사용한 이유는 createdAt 필드를 "년-월-일"(시 분 초 제외) 기준으로 내림차순으로 정렬하기 위해서이다.
startDate에 App에서 get으로 보내준 년-월-일 데이터를 넣고, endDate에는 getDate()+1을 하여서 1일을 더해준다.
startDate와 endDate에 값을 넣고, Sequelize.Op를 사용하여서 특정 범위 안에 들어가는 createdAt 만을 가져온다.
gt는 greater, lt는 little이다. 즉 위의 코드를 수식으로 바꾸자면 startDate< <endDate 이다.
초과/미만이 아니라, 이상/이하는 gte/lte로 사용하면 된다.
where을 거쳐 조건에 맞는 것들이 추출되면, order를 사용해서 정렬해준다.
pagination을 위해 limit과 offset을 사용하였다.
limit은 한 페이지에 넘겨 줄 item의 개수, offset은 몇개의 item을 skip하는지에 대한 offset이다.
위의 코드로는 한 번에 2개의 item씩 넘겨주며, offset은 현재의 offset * limit수 를 해주어서, 커서가 2칸씩 이동하게 구현하였다.
추가로 REST API로 형식을 맞추어줬는데, 이것에 대한 포스팅은 다음에 진행하겠다.
참고 링크
1. .getDate() + 1 사용
stackoverflow.com/questions/9989382/how-can-i-add-1-day-to-current-date/9989458
2. sequelize.op 연산자 사용 및 gt / lt 사용
velog.io/@cadenzah/sequelize-document-2
3. order 사용
victorydntmd.tistory.com/29?category=677306
4. pagination 사용
bezkoder.com/node-js-sequelize-pagination-mysql/
5. REST API 사용
'서버 > nodejs' 카테고리의 다른 글
node.js 에서 middleware Skip 하는 방법 (0) | 2021.05.11 |
---|---|
갑자기 궁금해져서 정리하는 js 변수 선언 방식 (0) | 2021.05.11 |
너무 헤매서 기록하는 sequelizer 사용 일지 02 (0) | 2021.04.17 |
Sequelize 사용 기록 - 01 (0) | 2021.04.12 |
내가 헤매서 쓰는 Firebase <-> Nodejs 연동 (0) | 2021.04.08 |