MongoDB에서 특정 날짜 이전의 문서 조회하기
MongoDB에서 지정된 날짜보다 이전에 저장된 문서를 찾고 싶다면 $lt(less than) 연산자를 사용하면 됩니다. $lt 연산자는 필드 값이 주어진 값보다 작은 문서만 선택하는 비교 연산자로, ISODate 형식의 날짜 데이터와 함께 사용하면 손쉽게 원하는 기간의 데이터를 추출할 수 있습니다.
실제 동작 과정을 예제를 통해 단계별로 살펴보겠습니다.
1단계: 테스트용 컬렉션 생성 및 문서 삽입
먼저 사용자 로그인 날짜(UserLoginDate)를 담은 문서들을 컬렉션에 삽입합니다.
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2016-03-21')});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd91e4de8cc557214c0e0d")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2016-05-11')});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd91ecde8cc557214c0e0e")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2017-01-31')});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd91f9de8cc557214c0e0f")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2018-05-15')});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd9206de8cc557214c0e10")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2019-04-01')});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd9211de8cc557214c0e11")
}2단계: find() 메서드로 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. pretty() 메서드를 함께 사용하면 결과를 보기 좋게 정렬하여 출력합니다.
> db.beforeSpecifyDateDemo.find().pretty();
위 쿼리는 다음과 같은 출력 결과를 반환합니다.
{
"_id" : ObjectId("5cbd91e4de8cc557214c0e0d"),
"UserLoginDate" : ISODate("2016-03-21T00:00:00Z")
}
{
"_id" : ObjectId("5cbd91ecde8cc557214c0e0e"),
"UserLoginDate" : ISODate("2016-05-11T00:00:00Z")
}
{
"_id" : ObjectId("5cbd91f9de8cc557214c0e0f"),
"UserLoginDate" : ISODate("2017-01-31T00:00:00Z")
}
{
"_id" : ObjectId("5cbd9206de8cc557214c0e10"),
"UserLoginDate" : ISODate("2018-05-15T00:00:00Z")
}
{
"_id" : ObjectId("5cbd9211de8cc557214c0e11"),
"UserLoginDate" : ISODate("2019-04-01T00:00:00Z")
}3단계: $lt 연산자로 특정 날짜 이전의 문서 조회
이제 핵심 부분입니다. UserLoginDate 필드 값이 2017년 1월 31일보다 이전인 문서만 조회하려면 아래와 같이 $lt 연산자에 ISODate 값을 지정합니다.
> db.beforeSpecifyDateDemo.find({UserLoginDate: { "$lt": ISODate("2017-01-31") }});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cbd91e4de8cc557214c0e0d"), "UserLoginDate" : ISODate("2016-03-21T00:00:00Z") }
{ "_id" : ObjectId("5cbd91ecde8cc557214c0e0e"), "UserLoginDate" : ISODate("2016-05-11T00:00:00Z") }결과 분석 및 참고 사항
총 5개의 문서 중 2016-03-21과 2016-05-11 두 개의 문서만 반환되었습니다. 그 이유는 $lt 연산자가 지정한 날짜보다 엄격하게 작은(strictly less than) 값만 매칭하기 때문입니다. 따라서 기준일인 2017-01-31 자체의 문서는 결과에 포함되지 않습니다.
만약 기준 날짜 당일의 문서까지 포함하고 싶다면 $lte(less than or equal) 연산자를 대신 사용하면 됩니다. 반대로 특정 날짜 이후의 문서를 조회할 때는 $gt(greater than) 또는 $gte(greater than or equal) 연산자를 활용할 수 있습니다.
또한 실무 환경에서는 날짜 필드에 인덱스를 생성해두면 대량의 데이터를 조회할 때도 쿼리 성능을 크게 향상시킬 수 있으니 참고하시기 바랍니다.