본문 바로가기
백엔드/DB

[MongoDB] MongoDB Aggregate()

by 작은소행성 2024. 10. 12.

db.collection.aggregate()

mongodb 조회 시 find 는 간단한 조건에 대해서 사용이 용이한데 다양한 조건을 넣어서 사용할 수는 없다. 따라서 aggregate는 다양한 조건들에 대해 검색하고 싶을때 사용한다. 

컬렉션 또는 뷰의 데이터에 대한 집계 값을 계산한다. 

> 파이프라인에 Explain 옵션이 포함된 경우 쿼리는 집계 연산 처리에 대한 세부 정보를 제공하는 문서를 반환한다. 

> 파이프라인에 $out 또는 $merge 연산자가 포함된 경우 쿼리는 빈 커서를 반환한다. 

db.collection.aggregate(pipeline, options)

 

pipeline

  • 데이터 aggregate 작업 또는 단계의 시퀀스로
  • 입력 문서에 대한 연산을 수행한다. 
  • $out 또는 $merge 연산자가 포함되지 않는 한 컬렉션의 문서를 수정하지 않는다. 
  • 메서드는 배열의 요소가 아닌 별도의 인수도 사용 가능하다.
  • 대신 배열로 사용하지 않으면 options 매개변수를 지정 할 수 없다. 

 

options

  • aggregate 명령에 전달하는 추가 옵션이다. 
  • pipeline 을 배열로 지정한 경우에만 사용할 수 있다. 

 

 

db.collection.aggregate() Stages 

$out, $merge, $geoNear, $changeStream, $changeStreamSplitLargeEvent 단계를 제외한 모든 단계는 파이프라인에서 여러번 사용이 가능하다. 

 

db.collection.aggregate( [ { <stage> }, ... ] )

 

  • $count : 집계 파이프라인의 해당 단계에 있는 문서 수를 반환한다. 
  • $match : 일치하는 문서의 스트림을 필터링한다.
  • $group : 지정된 표현식으로 입력 문서를 그룹화하고, 표현식을 각 그룹에 적용한다.
  • $limit : 지정된 개수만큼 출력한다.
  • $project : 새 필드를 추가하거나 기존 필드를 제거하는 등 스트림의 문서 모양을 변경한다. 
  • $merge : 결과 문서를 collection에 사용한다. (새 문서 삽입, 문서 병합, 문서 교체, 기존 문서 유지, 작업 실패 등)
  • $out : 파이프라인의 결과 문서는 collection에 사용한다. 파이프라인의 마지막 단계여야 한다. 
db.orders.aggregate( [

   // Stage 1: 날짜 기준으로 필터링 
   {
      $match:
      {
         "date": { $gte: new ISODate( "2020-01-30" ), $lt: new ISODate( "2022-01-30" ) }
      }
   },

   // Stage 2: 날짜별로 그룹화하고 결과 계산
   {
      $group:
      {
         _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
         totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } },
         averageOrderQuantity: { $avg: "$quantity" }
      }
   },

   // Stage 3: totalOrderValue 기준으로 내림차순 정렬 
   {
      $sort: { totalOrderValue: -1 }
   }

 ] )

 

 

 

검색조건 

similar to LIKE '%test%' in SQL
     { "name": { "$regex": "test", "$options": "i" } }


Starts with (equivalent to LIKE 'test%'):
     { "name": { "$regex": "^test", "$options": "i" } }


Ends with (equivalent to LIKE '%test'):
     { "name": { "$regex": "test$", "$options": "i" } }

Exact match with case sensitivity:
    { "name": { "$regex": "^test$", "$options": "" } }

 

 

 

 

 

 

https://www.mongodb.com/ko-kr/docs/manual/reference/operator/aggregation-pipeline/

반응형