본문 바로가기
Back Side/DBMS > MongoDB

[MongoDB] 오늘 작성한 글만 나오게 하기

by developerBeluga 2023. 2. 8.
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만 가져와 '-'에 연결해 시도했다.

누군가는 왜 저딴 코드를 만들어냐고 물어볼 수 있어서 기억을 올라가자면 

 

출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/Date

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
반응형

댓글