mongodb group by 샘플

2023. 3. 9. 07:50mongodb

반응형

몽고디비

1. 몽고디비 그룹바이 문법

$group 파이프라인 연산자는 MongoDB에서 집계(aggregate)를 수행하는데 사용됩니다. 이 연산자는 문서들을 그룹화하고 그룹화된 문서들의 합계, 평균, 최대, 최소 등의 값을 계산할 수 있습니다.

$group 파이프라인 연산자는 다음과 같은 구문을 사용합니다.

{
  $group: {
     _id: <expression>, // 그룹화할 기준 필드
     <field1>: { <accumulator1> : <expression1> },
     ...
  }
}

여기서 _id 필드는 그룹화할 기준 필드를 나타내며, <field>는 계산된 결과를 저장할 필드를 나타냅니다. <accumulator>는 계산 방법을 나타내며, <expression>은 계산 대상 필드를 나타냅니다.

예를 들어, 다음은 orders 컬렉션에서 status 필드를 그룹화하고 각 그룹의 합계를 계산하는 쿼리입니다:

db.orders.aggregate([
   {
      $group : {
         _id : "$status",
         totalAmount: { $sum: "$amount" }
      }
   }
])

이 쿼리는 orders 컬렉션에서 status 필드를 그룹화하고 각 그룹의 amount 필드의 합계를 totalAmount 필드에 저장합니다. 결과는 각 status 값별로 합계가 계산된 문서들의 배열이 됩니다.

2. 샘플 데이터 사용해 만들기

먼저 다음과 같은 샘플 데이터를 사용하겠습니다. 이는 sales라는 컬렉션에 저장된 판매 기록 데이터입니다.

db.sales.insertMany(
[
   { "_id" : 1, "item" : "apple", "price" : 0.5, "quantity" : 10, "date" : ISODate("2023-03-01T08:00:00Z") },
   { "_id" : 2, "item" : "banana", "price" : 0.25, "quantity" : 20, "date" : ISODate("2023-03-01T09:00:00Z") },
   { "_id" : 3, "item" : "pear", "price" : 0.3, "quantity" : 15, "date" : ISODate("2023-03-01T10:00:00Z") },
   { "_id" : 4, "item" : "apple", "price" : 0.5, "quantity" : 5, "date" : ISODate("2023-03-02T08:00:00Z") },
   { "_id" : 5, "item" : "banana", "price" : 0.25, "quantity" : 15, "date" : ISODate("2023-03-02T09:00:00Z") },
   { "_id" : 6, "item" : "pear", "price" : 0.3, "quantity" : 10, "date" : ISODate("2023-03-02T10:00:00Z") }
]
)

위 데이터에서 $group 연산자를 사용하여 item 필드를 기준으로 그룹화하고, price, quantity, total_pricedate 필드를 계산하여 그룹화된 결과를 반환하는 쿼리는 다음과 같습니다.

db.sales.aggregate([
    {
        $group: {
            _id: "$item",
            price: { $avg: "$price" },
            quantity: { $sum: "$quantity" },
            total_price: { $sum: { $multiply: ["$price", "$quantity"] } },
            date: { $max: "$date" }
        }
    }
])

위 쿼리는 sales 컬렉션에서 item 필드를 그룹화하고 각 그룹에서 평균 price 값을 계산하여 price 필드에 저장합니다. quantity 필드는 각 그룹의 quantity 값을 합산하고, total_price 필드는 price와 quantity 값을 곱한 결과를 합산하여 저장합니다. 마지막으로, date 필드는 각 그룹에서 가장 최근 날짜를 찾아 저장합니다.

위 쿼리의 결과는 다음과 같습니다.

[
  {
    "_id": "apple",
    "price": 0.5,
    "quantity": 15,
    "total_price": 7.5,
   }
]

이상 몽고디비 group by 정리를 마무리하겠습니다.

반응형