[CS] MongoDB Aggregation Framework Day-53

cptkuk91·2022년 1월 28일
0

CS

목록 보기
90/139

Aggregation Framework

  • $match
  • $group
  • $project

MongoDB에서 데이터를 쿼리하는 가장 간단한 방법 중 하나입니다.
MQL을 사용하는 모든 쿼리는 Aggregation Framework에서도 할 수 있습니다.

MongoDB쿼리 언어를 사용하는 모든 작업은 Aggregation Framework에서 수행 가능합니다.


Syntax

db.listingsAndReviews.find(
    {"amenities": "Wifi"},
    {"price":1, "address":1, "_id":0}).pretty()

db.listingsAndReviews.aggregate([
    {$match: {"amenities": "Wifi"}},
    {$project: {"price":1, "address":1, "_id":0}}
]).pretty();

Aggregation framework에서는 find가 아닌 aggregate 명령을 사용합니다.

aggregate를 사용하면 Document를 필터링하지 않고 그룹으로 데이터를 집계하거나 데이터를 수정할 수 있습니다.

aggregate를 사용할 땐 대괄호를 이용해 배열을 인자로 사용합니다.
파이프라인처럼 배열 요소의 순서대로 작업을 하기 때문입니다.


Aggregation Framework Filter

  • 필터를 통해 제어 할 수 있습니다.

$match 를 통과한 후 $project에 진입합니다. 단계별 조건을 설정해 필터할 수 있습니다.


$group

들어온 데이터 스트림을 여러개로 그룹화하는 연산자
(들어온 데이터를 가지고 여러 개의 개별 저장소로 빨아들여 그룹화하는 연산자입니다.)

필터링 단계 없이 원본 데이터를 바로 받아오는 경우, 원본 데이터를 수정하지 않습니다.
필터링 단계가 있다면 통과한 데이터를 다음 단계에서 작업합니다.

(필터링 단계가 있을 경우에는 파이프라인 이전 단계에서 가져온 데이터로 작업합니다.)


$group Syntax 예시

ex) 기본 예시

{$group:
	{
    	_id:<expression>,
    	<field1>: {accumulate1>:<expression1>},
    }
}

group을 사용해 기준에 따라 그룹화할 수 있습니다.

$group 단계는 Document를 받을 때 _id 필드 표현식을 사용하여 Document가 속한 그룹을 식별합니다.

$group 구문의 두 번째 부분을 사용하면 파이프라인을 통해 들어오는 데이터에 대해 더 많은 양적 분석을 수행할 수 있습니다.

ex) 실제 예시

db.컬렉션이름.aggregate([
	{$project: {"address":1, "_id":0}},
    {$group:{_id: "$address.country", "count":{"$sum":1}}}
]);

address 필드만 가져오기 위해 project를통해address필드만쿼리합니다.project를 통해 address 필드만 쿼리합니다.group 연산자를 이용해 address.country로 데이터를 그룹화합니다.
첫 번째 인자로 _id: "$address.country"로 작성 후 두 번째 인자로 몇개의 숙소가 있는지 sum을 통해 집계할 수 있습니다.

sum:1은 1개가 있다는 뜻이 아니라, 조건에 맞는 데이터가 있을경우 1씩 추가해줍니다. 1씩 추가 후 조건이 끝나면 총계를 확인 할 수 있습니다.(자바스크립트의 reduce와 비슷함)


$group + $sum

{
	"$group":
    	"_id": "category",
        "total": {"$sum": "$price"}
}

====>

{
    {
    	"category": "fish",
        "price": 5
    },
    {
    	"category": "meat",
        "price": 25
    },
    {
    	"category": "fish",
        "price": 7
    },
    {
    	"category": "fish",
        "price": 12
    },
    {
    	"category": "meat",
        "price": 25
    }
}

먼저 category를 통해 fish와 meat를 그룹화합니다.

  • $group 첫 번째 인자인 _id 필드 값에 category를 설정합니다.
  • total이라는 새로운 필드를 만들어 price 총합을 구해야합니다. ($sum) 연산자 사용
  • 이 경우 $sum: price (price)라는 해당 필드 값을 참조해 total 필드의 합이 나오게 됩니다.

Aggregation framework 요약

  • MQL 보다 다양한 쿼리를 작성할 수 있습니다.
  • 파이프라인의 각 단계 순서대로 데이터를 처리하고, 원본데이터를 수정하거나 변경하지 않습니다.
  • 각 단계의 이름 앞에는 $가 있고 그 뒤에는 실행할 작업에 대한 설명이 옵니다.
    ex) 예시
aggregate([
	{$<stage1>: {<field>:<value>}, {$<stage2>: {<field>:<value>}}}
])

Aggregation Framework 장점

  • 데이터를 계산, 재구성 및 재정립하는 기능을 통해 MQL의 필터링 기능을 능가하는 강력한 도구
  • 원본 데이터를 수정하거나 변경하지 않는다.
  • $match, $sum과 같은 $를 통해 여러 유형 작업 설명이 눈에 잘 들어온다.

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글