Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 특정 시간(시)의 레코드만 검색하는 방법 – $hour 연산자 활용법

MongoDB에서 날짜 필드의 특정 시간(hour)에 해당하는 레코드만 조회하고 싶다면 집계 파이프라인(Aggregation Pipeline)에서 $hour 연산자를 사용하면 됩니다. 이 글에서는 예제를 통해 특정 시간대의 문서를 검색하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 날짜 필드(OrderDatetime)를 포함한 문서들로 컬렉션을 생성합니다. 아래 예제에서는 고객 이름과 주문 일시를 함께 저장합니다.

> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-01-31 09:45:50")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8a86d78f205348bc62a")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-02-21 01:10:01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8b86d78f205348bc62b")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-04-01 04:10:11")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8e26d78f205348bc62c")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-05-11 08:53:01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8f26d78f205348bc62d")
}

2. 저장된 전체 문서 확인하기

find() 메서드와 pretty()를 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.

> db.mongoDbSearchForHoursDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd6e8a86d78f205348bc62a"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-01-31T09:45:50Z")
}
{
   "_id" : ObjectId("5cd6e8b86d78f205348bc62b"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-02-21T01:10:01Z")
}
{
   "_id" : ObjectId("5cd6e8e26d78f205348bc62c"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-04-01T04:10:11Z")
}
{
   "_id" : ObjectId("5cd6e8f26d78f205348bc62d"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-05-11T08:53:01Z")
}

3. $hour 연산자로 특정 시간의 레코드 검색하기

이제 핵심 단계입니다. aggregate() 메서드 안에서 $project로 날짜 필드에서 시간 값만 추출한 뒤, $match$in을 조합하여 원하는 시간(여기서는 8시와 1시)에 해당하는 문서만 필터링합니다.

> db.mongoDbSearchForHoursDemo.aggregate([
   { $project: { SpecificHours: { $hour: "$OrderDatetime" } } },
   { $match: { SpecificHours: { "$in": [08, 01] } } }
]);

4. 실행 결과

쿼리를 실행하면 지정한 두 시간(1시, 8시)에 해당하는 문서의 ID가 출력됩니다.

{ "_id" : ObjectId("5cd6e8b86d78f205348bc62b"), "SpecificHours" : 1 }
{ "_id" : ObjectId("5cd6e8f26d78f205348bc62d"), "SpecificHours" : 8 }

동작 원리 정리

이 쿼리는 두 단계로 구성됩니다.

첫 번째 단계($project): $hour 연산자가 OrderDatetime 필드에서 시간 부분(0~23 사이의 숫자)만 추출하여 SpecificHours라는 새 필드로 만듭니다.

두 번째 단계($match): 추출된 시간 값이 $in 배열 [08, 01]에 포함되어 있는지 확인하고, 조건에 맞는 문서만 최종 결과로 반환합니다.

이처럼 $hour, $minute, $dayOfMonth 등 MongoDB의 날짜 집계 연산자를 활용하면 날짜·시간 데이터를 자유롭게 필터링할 수 있습니다. 여러 개의 시간을 동시에 조회해야 할 때는 위 예제처럼 $in 연산자와 함께 사용하면 효율적입니다.