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

MongoDB에서 특정 값 조건으로 두 날짜 사이의 데이터를 조회하고 그룹화해 합계와 개수 구하기

MongoDB에서 문서를 조건에 맞게 필터링할 때는 $match 연산자를 사용하고, 두 날짜 사이의 데이터를 조회할 때는 $gte(크거나 같음)와 $lte(작거나 같음) 연산자를 활용합니다. 이번 글에서는 특정 값 조건과 날짜 범위를 함께 적용한 뒤, 그룹화하여 합계($sum)와 개수(count)를 구하는 방법을 예제와 함께 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 demo560 컬렉션을 만들고 테스트용 문서를 삽입합니다.

> db.demo560.insertOne({"value1":40,"value2":40,shippingDate:new ISODate("2020-02-26")});{
   "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e867")
}
> db.demo560.insertOne({"value1":20,"value2":60,shippingDate:new ISODate("2020-02-26")});{
   "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e868")
}
> db.demo560.insertOne({"value1":40,"value2":70,shippingDate:new ISODate("2020-03-31")});{
   "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e869")
}
> db.demo560.insertOne({"value1":40,"value2":130,shippingDate:new ISODate("2020-03-31")});{
   "acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e86a")
}

2. 전체 문서 조회하기

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

> db.demo560.find();

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

{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e867"), "value1" : 40, "value2" : 40, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e868"), "value1" : 20, "value2" : 60, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e869"), "value1" : 40, "value2" : 70, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e86a"), "value1" : 40, "value2" : 130, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }

3. 날짜 범위와 특정 값으로 그룹화 및 집계

다음은 value1이 40인 문서 중 shippingDate가 2020-02-26부터 2020-03-31 사이에 있는 데이터를 조회하고, 배송일(shippingDate) 기준으로 그룹화하여 value2의 합계(total)와 문서 개수(count)를 계산하는 쿼리입니다.

> db.demo560.aggregate([
... {
   $match: {
      "value1": 40,
      "shippingDate": {
         "$gte": ISODate("2020-02-26"),
         "$lte": ISODate("2020-03-31")
      }
   }
... },
... {
   $group: {
      "_id": "$shippingDate",
      total: {
         $sum: '$value2'
      },
      count: {
         $sum: 1
      }
   }
... }
... ])

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

{ "_id" : ISODate("2020-03-31T00:00:00Z"), "total" : 200, "count" : 2 }
{ "_id" : ISODate("2020-02-26T00:00:00Z"), "total" : 40, "count" : 1 }

결과를 보면 2020-03-31에는 value1이 40인 문서가 2건 존재하고 value2의 합계는 200이며, 2020-02-26에는 1건이 존재하고 합계는 40임을 알 수 있습니다. 이처럼 $match로 조건을 걸고 $group과 $sum을 조합하면 날짜별 통계 데이터를 손쉽게 추출할 수 있습니다.