여러 개의 날짜 필드 중에서 가장 오래된(최소) 날짜를 찾아야 하는 경우가 종종 있습니다. MongoDB에서는 aggregate() 파이프라인과 $min 연산자를 활용하면 이 작업을 손쉽게 처리할 수 있습니다. 지금부터 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 세 개의 날짜 키(Date1, Date2, Date3)를 가진 문서들을 담은 컬렉션을 생성합니다.
> db.demo353.insertOne({"Date1":new ISODate("2019-01-10"),"Date2":new ISODate("2016-01-21"),"Date3":new ISODate("2020-04-11")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e568261f8647eb59e5620be")
}
> db.demo353.insertOne({"Date1":new ISODate("2011-11-20"),"Date2":new ISODate("2013-12-10"),"Date3":new ISODate("2014-01-05")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e56827ff8647eb59e5620bf")
}
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo353.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e568261f8647eb59e5620be"), "Date1" : ISODate("2019-01-10T00:00:00Z"), "Date2" : ISODate("2016-01-21T00:00:00Z"), "Date3" : ISODate("2020-04-11T00:00:00Z") }
{ "_id" : ObjectId("5e56827ff8647eb59e5620bf"), "Date1" : ISODate("2011-11-20T00:00:00Z"), "Date2" : ISODate("2013-12-10T00:00:00Z"), "Date3" : ISODate("2014-01-05T00:00:00Z") }
3. 가장 오래된 날짜를 찾는 쿼리 작성하기
다음은 각 문서에서 세 개의 날짜 중 가장 오래된 날짜를 추출하는 쿼리입니다. $project 단계에서 $min 연산자를 사용하고, $ifNull 연산자를 함께 적용하면 특정 날짜 필드가 누락된 문서도 안전하게 처리할 수 있다는 점이 핵심입니다.
> db.demo353.aggregate([
... {
... $project: {
... OldestDate: {
... $min: [
... { $ifNull: [ "$Date1", new Date() ] },
... { $ifNull: [ "$Date2", new Date() ] },
... { $ifNull: [ "$Date3", new Date() ] },
... ]
... }
... }
... }
... ])
4. 실행 결과 확인하기
쿼리를 실행하면 각 문서별로 세 개의 날짜 중 가장 오래된 날짜가 OldestDate 필드로 출력됩니다.
{ "_id" : ObjectId("5e568261f8647eb59e5620be"), "OldestDate" : ISODate("2016-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e56827ff8647eb59e5620bf"), "OldestDate" : ISODate("2011-11-20T00:00:00Z") }
핵심 포인트 정리
- $min: 배열 형태로 전달된 값들 중 최솟값을 반환합니다. 날짜 타입의 경우 가장 오래된 날짜를 의미합니다.
- $ifNull: 필드가 존재하지 않거나 null일 때 대체 값을 반환하여 오류 없이 처리할 수 있게 해줍니다. 위 예제에서는 현재 시간(new Date())을 기본값으로 사용했습니다.
- $project: 애그리게이션 파이프라인에서 출력할 필드를 지정하는 단계입니다.
이처럼 $min과 $ifNull을 조합하면 날짜 필드가 일부 비어 있는 문서가 있어도 안정적으로 가장 오래된 날짜를 계산할 수 있습니다. 실무에서 여러 날짜 필드를 다루는 경우 유용하게 활용해 보시기 바랍니다.