Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 특정 날짜 데이터 조회하기 – $gte와 $lt 연산자 활용법

사용자의 로그인 날짜를 저장해 두고 있다고 가정해 보겠습니다. 그런데 전체 기록이 아니라 특정 날짜에 해당하는 로그인 기록의 개수만 확인하고 싶다면 어떻게 해야 할까요? 이럴 때 $gte(이상)와 $lt(미만) 연산자를 count() 메서드와 함께 사용하면 간단하게 해결할 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입하겠습니다.

> db.findDataByDateDemo.insertOne({"UserName":"John","UserLoginDate":new ISODate("2019-01-31")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd8cd7bf3115999ed511ed")
}
> db.findDataByDateDemo.insertOne({"UserName":"Larry","UserLoginDate":new ISODate("2019-02-01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd8ce7bf3115999ed511ee")
}
> db.findDataByDateDemo.insertOne({"UserName":"Sam","UserLoginDate":new ISODate("2019-05-02")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd8cf3bf3115999ed511ef")
}
> db.findDataByDateDemo.insertOne({"UserName":"David","UserLoginDate":new ISODate("2019-05-16")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd8d00bf3115999ed511f0")
}
> db.findDataByDateDemo.insertOne({"UserName":"Carol","UserLoginDate":new ISODate("2019-10-19")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd8d0ebf3115999ed511f1")
}

위 코드는 총 5명의 사용자 정보를 서로 다른 날짜와 함께 저장합니다. 각 문서는 사용자 이름(UserName)과 로그인 날짜(UserLoginDate) 필드로 구성되어 있습니다.

2. 저장된 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.findDataByDateDemo.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cdd8cd7bf3115999ed511ed"), "UserName" : "John", "UserLoginDate" : ISODate("2019-01-31T00:00:00Z") }
{ "_id" : ObjectId("5cdd8ce7bf3115999ed511ee"), "UserName" : "Larry", "UserLoginDate" : ISODate("2019-02-01T00:00:00Z") }
{ "_id" : ObjectId("5cdd8cf3bf3115999ed511ef"), "UserName" : "Sam", "UserLoginDate" : ISODate("2019-05-02T00:00:00Z") }
{ "_id" : ObjectId("5cdd8d00bf3115999ed511f0"), "UserName" : "David", "UserLoginDate" : ISODate("2019-05-16T00:00:00Z") }
{ "_id" : ObjectId("5cdd8d0ebf3115999ed511f1"), "UserName" : "Carol", "UserLoginDate" : ISODate("2019-10-19T00:00:00Z") }

3. 특정 날짜 범위의 데이터 개수 구하기

이제 핵심 부분입니다. 아래 쿼리는 $gte$lt 연산자를 조합하여 2019년 5월 2일부터 2019년 5월 18일 사이(시작일 포함, 종료일 미포함)에 로그인한 사용자 수를 집계합니다.

> db.findDataByDateDemo.count({"UserLoginDate":{ "$gte": new Date("2019-05-02"), "$lt": new Date("2019-05-18") }});

실행 결과는 다음과 같습니다.

2

결과값 2는 해당 기간에 로그인한 사용자가 Sam(2019-05-02)과 David(2019-05-16), 두 명임을 의미합니다.

핵심 정리

  • $gte: 지정한 날짜보다 크거나 같은(이상) 값을 매칭합니다.
  • $lt: 지정한 날짜보다 작은(미만) 값을 매칭합니다.
  • 두 연산자를 함께 사용하면 시작일은 포함하고 종료일은 제외하는 날짜 범위 검색이 가능합니다.
  • 종료일까지 포함하고 싶다면 $lte(이하)를 사용하면 됩니다.

날짜 범위 검색은 로그 통계, 일별 방문자 수 집계 등 실무에서 자주 사용되는 패턴이므로 꼭 익혀두시기 바랍니다.