MongoDB에서 특정 기간 사이의 날짜 데이터를 조회하려면 $gt(보다 큼) 연산자와 $lt(보다 작음) 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 날짜 범위 조건으로 문서를 검색하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 날짜 필드를 포함한 문서들을 담은 컬렉션을 생성합니다. ISODate() 함수를 사용해 날짜 값을 저장합니다.
> db.demo60.insertOne({"ArrivalDate":new ISODate("2019-01-11 12:30:10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2863fecfb11e5c34d89927")
}
> db.demo60.insertOne({"ArrivalDate":new ISODate("2019-10-12 03:10:00")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e28641acfb11e5c34d89928")
}
> db.demo60.insertOne({"ArrivalDate":new ISODate("2019-01-14 05:11:20")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e28642acfb11e5c34d89929")
}위 명령을 실행하면 demo60 컬렉션에 세 개의 문서가 저장됩니다. 각 문서는 도착 날짜(ArrivalDate) 정보를 가지고 있습니다.
2. 저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 있는 모든 문서를 확인할 수 있습니다.
> db.demo60.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e2863fecfb11e5c34d89927"), "ArrivalDate" : ISODate("2019-01-11T12:30:10Z") }
{ "_id" : ObjectId("5e28641acfb11e5c34d89928"), "ArrivalDate" : ISODate("2019-10-12T03:10:00Z") }
{ "_id" : ObjectId("5e28642acfb11e5c34d89929"), "ArrivalDate" : ISODate("2019-01-14T05:11:20Z") }3. 날짜 범위 조건으로 조회하는 쿼리
이제 $gt와 $lt 연산자를 사용해 특정 날짜 구간에 속하는 레코드만 가져오는 쿼리를 작성해 보겠습니다. 아래 예제는 2019년 1월 9일 12시 30분 10초부터 2019년 1월 16일 12시 30분 10초 사이의 데이터를 조회합니다.
> db.demo60.find({"ArrivalDate": {"$gt":ISODate("2019-01-09T12:30:10Z"), "$lt": ISODate("2019-01-16T12:30:10Z")}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e2863fecfb11e5c34d89927"), "ArrivalDate" : ISODate("2019-01-11T12:30:10Z") }
{ "_id" : ObjectId("5e28642acfb11e5c34d89929"), "ArrivalDate" : ISODate("2019-01-14T05:11:20Z") }결과 분석
조회 결과를 보면 지정한 날짜 범위 안에 있는 두 개의 문서(2019-01-11, 2019-01-14)만 반환된 것을 확인할 수 있습니다. 반면 2019년 10월에 해당하는 문서는 범위를 벗어나므로 결과에서 제외되었습니다.
참고: 경계값 포함 여부 조절하기
$gt와 $lt는 각각 '초과'와 '미만'을 의미하므로 시작 날짜와 종료 날짜 자체는 결과에 포함되지 않습니다. 만약 경계 날짜까지 포함하고 싶다면 $gte(이상)와 $lte(이하) 연산자를 대신 사용하면 됩니다. 또한 날짜 범위 조회 성능을 높이려면 해당 날짜 필드에 인덱스를 생성하는 것이 좋습니다.