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

MongoDB에서 시간(Hour)별로 $avg를 사용해 데이터 집계하는 방법

MongoDB에서 데이터를 집계하려면 aggregate() 메서드를 사용합니다. 이 메서드는 컬렉션에 저장된 데이터의 집계 값을 계산할 때 활용됩니다.

먼저 예제용 문서들을 담은 컬렉션을 생성해 보겠습니다.

> db.demo544.insertOne({"DueTime":new ISODate("2020-01-10 12:10:20"),Amount:100});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8e1f029e5f92834d7f05ce")
}
> db.demo544.insertOne({"DueTime":new ISODate("2020-01-12 12:00:00"),Amount:500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8e1f089e5f92834d7f05cf")
}
> db.demo544.insertOne({"DueTime":new ISODate("2020-01-12 12:10:20"),Amount:900});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8e1f109e5f92834d7f05d0")
}

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

> db.demo544.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e8e1f029e5f92834d7f05ce"), "DueTime" : ISODate("2020-01-10T12:10:20Z"), "Amount" : 100 }
{ "_id" : ObjectId("5e8e1f089e5f92834d7f05cf"), "DueTime" : ISODate("2020-01-12T12:00:00Z"), "Amount" : 500 }
{ "_id" : ObjectId("5e8e1f109e5f92834d7f05d0"), "DueTime" : ISODate("2020-01-12T12:10:20Z"), "Amount" : 900 }

다음은 $hour 연산자와 $avg 연산자를 조합해 시간(hour) 단위로 평균을 집계하는 쿼리입니다.

> db.demo544.aggregate(
    { "$group": { "_id": { "$hour": "$DueTime" }, "Amount": { "$avg": "$Amount" } } }
)

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

{ "_id" : 12, "Amount" : 500 }

세 문서의 DueTime이 모두 12시(정오)대에 속하기 때문에 하나의 그룹으로 묶였고, 각 Amount 값(100, 500, 900)의 평균인 500이 계산되었습니다.

핵심 연산자 정리

  • $group: 지정한 기준 표현식에 따라 문서들을 그룹화합니다.
  • $hour: 날짜 필드에서 시간(0~23)을 추출합니다. 필드 이름 앞에는 반드시 $를 붙여야 하며, 대소문자까지 원본 필드명과 정확히 일치해야 합니다(예: "$DueTime"). 만약 대소문자가 맞지 않으면 _idnull로 반환되므로 주의가 필요합니다.
  • $avg: 그룹별 숫자 값들의 산술 평균을 계산합니다.