[aggregate] redact 사용

2021. 3. 8. 13:40프로그래밍-Web/MongoDB

aggregate에서 자주 사용되지만 꽤 복잡한 쿼리 중 하나라 정리해본다.

사실상 filter와 유사한 operator라고 생각하면 된다.

aggregate는 각각의 stage가 존재하는데, filter가 project stage에서 사용되는 커맨드라면 redact는 또 하나의 stage이다.

stackoverflow를 찾아보면 filter가 근소하게 성능이 좋다고는 한다

실제로 최신 Mongodb버전에 등장한 filter를 사용하는것이 선호되는것으로 보인다.

나 역시 실제 적용하는 상황에서는 filter를 사용할듯 하다.

 

무튼 redact는 복잡하게 nested한 document에 대해서 개발자가 원하는 조건에 맞는 결과만 리턴하게 만든다. 

해당 설명은 공식문서의 예시를 사용해보겠다.

다음과 같은 nested한 document에 대해

 

해당 방식으로 STLW와 G가 포함된 subdocument를 찾아낼 수 있다.

cond는 특정 컨디션에 대해 True or False를 반환하는데, 이때 주의할 부분은 if 구문이다.

if구문의 조건에서 useAccess배열과 $tags의 교집합이 0보다 크면 DESCEND를 그렇지 않으면 PRUNE을 적용하게 한다.

이때 DESCEND는 embedded된 모든 필드를 스캔하여 리턴하고, PURNE은 해당 레벨의 필드만 스캔하여 리턴한다

 

결과는 다음과 같다