MongoDB에서 시작일(startDate)과 종료일(endDate) 사이의 기간이 가장 긴 문서를 조회하려면 애그리게이션 파이프라인의 $addFields, $sort, $limit 연산자를 조합하면 됩니다. 이번 글에서는 실제 예제를 통해 단계별로 그 과정을 자세히 살펴보겠습니다.
1단계: 샘플 컬렉션과 문서 생성하기
먼저 테스트에 사용할 문서가 포함된 컬렉션을 생성합니다.
> db.demo344.insertOne({"startDate":"2020-02-24 10:50:00", "endDate":"2020-02-24 11:50:00"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e53f52cf8647eb59e5620aa")
}
> db.demo344.insertOne({"startDate":"2020-02-24 08:00:00", "endDate":"2020-02-24 11:50:50"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e53f53df8647eb59e5620ab")
}2단계: find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 한눈에 확인할 수 있습니다.
> db.demo344.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e53f52cf8647eb59e5620aa"), "startDate" : "2020-02-24 10:50:00", "endDate" : "2020-02-24 11:50:00" }
{ "_id" : ObjectId("5e53f53df8647eb59e5620ab"), "startDate" : "2020-02-24 08:00:00", "endDate" : "2020-02-24 11:50:50" }3단계: 기간이 가장 긴 객체 쿼리하기
기간이 가장 긴 문서를 찾는 핵심 로직은 다음과 같습니다.
- $toDate: 문자열로 저장된 날짜 값을 Date 타입으로 변환합니다.
- $subtract: 종료일에서 시작일을 빼서 기간(밀리초)을 계산하고, $addFields로 새 필드(longestTime)에 저장합니다.
- $sort와 $limit: longestTime을 내림차순으로 정렬한 뒤 첫 번째 문서만 반환합니다.
> db.demo344.aggregate([
... { $addFields: {
... longestTime: { $subtract: [ { $toDate: "$endDate" }, { $toDate: "$startDate" } ] }
... } },
... { $sort: { longestTime: -1 } },
... { $limit: 1 }
... ])
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e53f53df8647eb59e5620ab"), "startDate" : "2020-02-24 08:00:00", "endDate" : "2020-02-24 11:50:50", "longestTime" : NumberLong(13850000) }결과를 보면 두 번째 문서(08:00:00~11:50:50)의 기간이 13,850,000밀리초, 즉 약 3시간 50분 50초로 더 길기 때문에 해당 문서가 최종적으로 반환되었습니다. 이처럼 $addFields로 계산 필드를 추가한 뒤 $sort와 $limit을 조합하면, MongoDB에서도 손쉽게 가장 긴 기간을 가진 문서를 조회할 수 있습니다.