[aggregate] lookup으로 필요한 부분 JOIN하여 계산하기

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

aggregate를 하나의 컬렉션에서 복잡한 연산 처리하는 목적으로도 사용하지만,

보통 nosql에 존재하지 않는 JOIN을 유사하게 따라하기 위해 사용한다.

아래 예시는 aggregate로 다른 collection 데이터를 가져와 JOIN후 결과를 리턴하는 로직이다.

 

 

해당 로직은 CBSModel이라는 콜렉션에서 동작하고, JOIN을 위해 cbs라는 콜렉션에 접근한다

(사실 두개는 같은 콜렉션이지만, from에 위치한 collection이 같고다름은 중요하지 않다)

 

CBSModel 컬렉션에는 childIdList라는 필드가 존재한다.

해당 필드는 id를 배열로 가지고 있으며, 각 id의 value는 cbs 콜렉션의 필드에 해당된다.

헷갈리니 CBSMdoel은 원컬렉션, cbs는 목적컬렉션으로 지칭하겠다.

 

1) match로 필요한 설정을 통해 필터링을 해준다. fully outer join이 필요하다면 특별히 설정해주지 않아도 된다. and 연산자는 조건 두개를 모두 만족하는 경우에 대해 필터링을 하도록 해준다.

 

2) lookup은 JOIN을 수행한다. 

 

- from :  join의 대상이 되는 collection(목적컬렉션)을 기입한다.

- localField: join을 하기 위해 기준이 되는 원컬렉션의 key를 기입한다. 예시에서는 CBSModel 컬렉션 ChildIdList의 value와 같은 항목을 찾아 join하려는 것이므로, ChildIdList가 된다.

- foreignField: 목적컬렉션의 조건에 해당하는 key를 기입한다. 즉, 비교의 대상이 되는 필드를 지정하는 것이다. 예시의 경우 ChildIdList의 value를 _id로 가진 document를 찾기 위함이므로, _id가 된다.

-as: 결과값에 대한 naming이다.

 

여기까지 수행하면 이렇게 된다.

as로 지정한 childList라는 필드에 조건에 부합하는 document들이 들어있다.

여기서 끝나는 것이 아니라, 해당 결과에 대해 goup을 활용하여 연산을 수행할 수 있다.