[aggregate] 기본적인 aggregate 사용 방식 & 배열이 존재하는 경우

2021. 2. 10. 17:18프로그래밍-Web/MongoDB

 

aggregate는 복잡한 연산이 필요한 read에 대한 내용이다.

find만으로는 데이터 가공에 한계가 있기 때문에, aggregate를 활용하여 복잡한 연산을 수행한다.

 

가장 흔하게 사용하는 방식은 다음과 같다.

match command로 조건에 맞는 document를 filtering해주고, 

group을 사용하여 필요한 연산을 진행하는 것이다.

 

이 과정에서 배열이 argument로 존재한다면 까다로워진다.

예시코드의 경우도 itemList가 배열로 존재하는 경우이다.

이 경우에는 unwind 를 통해 배열을 iterate하며 원소 하나당 POJO 객체를 만들어준다

배열을 풀어놓으면 dot command로 접근이 가능하다.

 

해당 로직은 nested한 document 배열의 cost값들을 읽어 quantity를 곱한 후, 이를 모든 원소에 대해 수행하여 총합을 더해주는 로직이다.

글로만 써도 복잡한 연산이다.

하지만 aggregate를 사용하면 손쉬워진다.

 

cost 계산로직만 따로 떼서 보자면, sum과 multiply를 사용했다는 사실을 알 수 있다.

itemList가 unwind를 통해 배열에서 벗어난 개별원소가 되었으므로, 각 cost와 quantity에 dot으로 접근한다.

이후 multiply를 통해 두 값을 곱해준다.

sum command를 수행하면 해당 작업을 모든 개별원소에 대해 수행하여 더해준다.

이후 group command를 통해 로직의 결과물을 우리가 원하는 객체형태로 받아볼 수 있게 된다.

이때 주의할점은 _id가 NotNull이라는 점이다.