MongoDB에서 현재 시간(new Date())보다 이전이거나 같은 날짜/시간 값을 가진 문서를 조회하려면 $lte(less than or equal) 연산자를 사용하면 됩니다. $lte는 '작거나 같음'을 의미하며, 정확히 '작은' 값만 조회하고 싶다면 $lt 연산자를 대신 사용할 수 있습니다.
실제 예제를 통해 살펴보겠습니다. 먼저 샘플 문서들이 포함된 컬렉션을 생성합니다.
1. 샘플 컬렉션 생성하기
> db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Larry","CustomerProductName":"Product-1","ArrivalDate":new ISODate("2017-01-31")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8ab66324ffac2a7dc59")
}
> db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Mike","CustomerProductName":"Product-2","ArrivalDate":new ISODate("2019-04-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8c166324ffac2a7dc5a")
}
> db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Chris","CustomerProductName":"Product-3","ArrivalDate":new ISODate("2019-03-31")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8d266324ffac2a7dc5b")
}
> db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Robert","CustomerProductName":"Product-4","ArrivalDate":new ISODate("2019-04-02")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8e766324ffac2a7dc5c")
}2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.dateTimeValueLessThanNowDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.
{
"_id" : ObjectId("5ca1e8c166324ffac2a7dc5a"),
"CustomerName" : "Mike",
"CustomerProductName" : "Product-2",
"ArrivalDate" : ISODate("2019-04-01T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8d266324ffac2a7dc5b"),
"CustomerName" : "Chris",
"CustomerProductName" : "Product-3",
"ArrivalDate" : ISODate("2019-03-31T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8e766324ffac2a7dc5c"),
"CustomerName" : "Robert",
"CustomerProductName" : "Product-4",
"ArrivalDate" : ISODate("2019-04-02T00:00:00Z")
}3. 현재 시간보다 이전인 날짜 조회하기
이제 핵심인 조회 쿼리를 살펴보겠습니다. 현재 날짜가 2019-04-02라고 가정할 때, ArrivalDate 필드의 값이 현재 시간(new Date())보다 작거나 같은 문서만 조회하는 쿼리는 다음과 같습니다.
> db.dateTimeValueLessThanNowDemo.find({ ArrivalDate: { $lte: new Date() } }).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca1e8ab66324ffac2a7dc59"),
"CustomerName" : "Larry",
"CustomerProductName" : "Product-1",
"ArrivalDate" : ISODate("2017-01-31T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8c166324ffac2a7dc5a"),
"CustomerName" : "Mike",
"CustomerProductName" : "Product-2",
"ArrivalDate" : ISODate("2019-04-01T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8d266324ffac2a7dc5b"),
"CustomerName" : "Chris",
"CustomerProductName" : "Product-3",
"ArrivalDate" : ISODate("2019-03-31T00:00:00Z")
}결과 분석
출력 결과를 보면 현재 날짜(2019-04-02)보다 이전인 날짜를 가진 세 개의 문서(Larry, Mike, Chris)만 반환되었습니다. Robert의 문서(ArrivalDate: 2019-04-02)는 조건에서 제외되었는데, 이는 new Date()가 실행 시점의 정확한 시각까지 포함하기 때문입니다. 만약 당일 날짜의 데이터도 포함하고 싶다면 특정 날짜의 자정 시각을 기준으로 범위를 지정하는 방식을 활용하는 것이 좋습니다.
참고로, MongoDB에서 날짜 비교 시 주의할 점은 다음과 같습니다.
- $lt: 지정한 값보다 작은 경우 (미만)
- $lte: 지정한 값보다 작거나 같은 경우 (이하)
- $gte: 지정한 값보다 크거나 같은 경우 (이상)
이처럼 $lte 연산자와 new Date()를 조합하면 손쉽게 현재 시점 기준으로 과거 데이터를 필터링할 수 있어, 만료된 상품 조회나 지난 일정 검색 등 다양한 실무 시나리오에 활용할 수 있습니다.