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

MongoDB에서 날짜 범위 기준으로 일·주·월별 그룹화하는 방법

MongoDB에서 날짜 데이터를 주별 또는 월별로 묶어 통계를 내고 싶다면 집계 파이프라인(Aggregation Pipeline)의 $week$month 연산자를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 날짜 범위를 기준으로 데이터를 그룹화하고 평균값을 계산하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 테스트용 컬렉션에 문서를 생성합니다. 각 문서는 순위(Rank)와 마감일(DueDate) 필드를 가지고 있습니다.

> db.demo133.insertOne({"Rank":18,"DueDate":new ISODate("2020-01-10")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31980968e7f832db1a7f78")
}
> db.demo133.insertOne({"Rank":12,"DueDate":new ISODate("2020-01-10")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31982568e7f832db1a7f79")
}
> db.demo133.insertOne({"Rank":12,"DueDate":new ISODate("2020-02-01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31986568e7f832db1a7f7a")
}
> db.demo133.insertOne({"Rank":20,"DueDate":new ISODate("2020-02-01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31986c68e7f832db1a7f7b")
}

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo133.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e31980968e7f832db1a7f78"), "Rank" : 18, "DueDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e31982568e7f832db1a7f79"), "Rank" : 12, "DueDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e31986568e7f832db1a7f7a"), "Rank" : 12, "DueDate" : ISODate("2020-02-01T00:00:00Z") }
{ "_id" : ObjectId("5e31986c68e7f832db1a7f7b"), "Rank" : 20, "DueDate" : ISODate("2020-02-01T00:00:00Z") }

3. 날짜 범위 기준으로 그룹화하는 쿼리

이제 핵심인 집계 쿼리입니다. 먼저 $project 단계에서 $week$month 연산자로 DueDate 필드에서 주차 정보와 월 정보를 추출합니다. 이어서 $group 단계에서 주차(Week)를 기준으로 문서들을 묶고, 각 그룹의 Rank 평균값을 $avg로 계산하며, 해당 그룹이 속한 월은 $first로 가져옵니다.

> db.demo133.aggregate([
...    {
...       "$project": {
...          "DueDateWeek": { "$week": "$DueDate" },
...          "DueDateMonth": { "$month": "$DueDate" },
...          "Rank": 1
...       }
...    },
... {
...    "$group": {
...       "_id": "$DueDateWeek",
...       "AvgValue": { "$avg": "$Rank" },
...       "MonthValue": { "$first": "$DueDateMonth" }
...       }
...    }
... ])

4. 실행 결과 분석

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

{ "_id" : 4, "AvgValue" : 16, "MonthValue" : 2 }
{ "_id" : 1, "AvgValue" : 15, "MonthValue" : 1 }

결과를 해석해 보면 다음과 같습니다.

  • _id: 1 — 1주차에 해당하는 문서들(2020-01-10)이 그룹화되었으며, Rank 값 18과 12의 평균인 15, 속한 월은 1월입니다.
  • _id: 4 — 4주차에 해당하는 문서들(2020-02-01)이 그룹화되었으며, Rank 값 12와 20의 평균인 16, 속한 월은 2월입니다.

마무리

이처럼 MongoDB의 집계 프레임워크를 사용하면 날짜 필드에서 주($week), 월($month), 일($dayOfMonth 등) 정보를 손쉽게 추출하여 원하는 단위별로 데이터를 그룹화할 수 있습니다. 여기에 $avg, $sum 같은 누적 연산자를 조합하면 주간 평균, 월간 합계 등 다양한 시계열 통계를 효율적으로 구현할 수 있습니다.