728x90
반응형
$regex 쓰면 되지 않을까?
'오늘 작성한 글만 나오게' 라는 조건을 생각하자마자 MongoDB의 $regex 쿼리가 생각났다.
$regex는 MongoDB에서 정규식을 쓰게 해주는 쿼리이고,
정규식은 문자열에 포함된 문자 조합을 찾기 위해 사용되는 패턴이다.
const todayDate = new Date();
const getFullYear = todayDate.getFullYear();
const getMonth = todayDate.getMonth();
const getDay = todayDate.getDay();
const findDate = getFullYear + "-" + getMonth + "-" + getDay;
const allBusinessData = await Bussiness.find({
createdAt: { $regex: findDate },
});
매우 무식해보이는 코드를 짜봤다.
new Date를 사용해서 오늘 날짜에서 필요한 year, month, day만 가져와 '-'에 연결해 시도했다.
누군가는 왜 저딴 코드를 만들어냐고 물어볼 수 있어서 기억을 올라가자면
JavaScript newDate() 공식문서에 제시하는 예제 코드의 date2를 보다가 생각한 것이다.
지금 생각해보면 뭐에 홀린 것 같다.
아무튼 해당 코드를 돌려보니 Error: Can't use $regex with Date 라는 오류가 발생했다.
왜 오류가 발생했을까?
그거야 정규식은 문자열에 포함된 문자조합을 찾는 패턴이라고 위에 말했다.
문! 자! 열!
알다시피 new Date()로 생성된 date는 type이 string이 절대 아니다.
그러므로 data type 그자체인 createdAt에서 $regex를 이용해서 찾고자 하는 것이 잘못된 것이었다.
그럼 어떻게 오늘치 글만 찾을 수 있을까?
const startDate = new Date();
startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);
const endDate = new Date(startDate);
endDate.setHours(23);
endDate.setMinutes(59);
endDate.setSeconds(59);
const allBusinessData = await Bussiness.find({
createdAt: { $gt: startDate, $lt: endDate },
});
두번째로 생각한 방법은 startDate와 endDate를 각 00:00:00, 23:59:59로 만들어준 후 $get, $lt로 구분하여 가져온다.
저리 코드가 길어진 것에 불만족을 느끼지만 현 단계에서 원하는 시간을 조정하는 방법은 이 방법 밖에 없는 것 같다.
728x90
반응형
'Back Side > DBMS > MongoDB' 카테고리의 다른 글
[MongoDB] mongoose의 populate을 이용해서 편하게 다른 컬렉션 정보 가져오기 (1) | 2023.12.08 |
---|---|
[MongoDB] 대량의 데이터 처리 프로그래밍 모델 (1) 맵리듀스 map-reduce (0) | 2022.11.08 |
[MongoDB] Robo3T Failed to load documents 해결 방법 - Studio 3T 설치 (0) | 2022.08.30 |
[MongoDB] syncIndexes() 이용해서 변경한 index 자동 적용시키기 (0) | 2022.07.28 |
[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (3) - NodeJS에 사용하기 (0) | 2022.07.13 |
댓글