쿼리 명령어는 특정 도큐먼트를 불러오는데 적합하지만, 불러온 정보를 이후에 가공하지는 못한다. 정보를 가공하는 작업을 '집계'라고 부른다. 필드의 구조를 바꾸고, 도큐먼트를 버케팅하여 다른 형태로 보여주는 등의 작업이 집계의 예시다.
도큐먼트를 집계하는 방법은 크게 3가지로 나뉜다. 최선의 방법은 없고, 필요한 곳에 적절한 방법을 구사해야 한다.
그런데 정말, 웬만해서는 Aggregate 를 사용하는 선에서 문제가 해결 될 것이다.
애플리케이션 | 맵-리듀스 | Aggregate 파이프라인 | |
자유도 | 좋음 | 좋음 | 나쁨 |
처리 속도 | 느림 | 보통 | 빠름 |
램 사용량 | 매우 높음 | 높음 | 낮음 |
처리 위치 | 앱 단에서 처리함 | 자바스크립트 엔진 (쿼리 처리기에서 JS엔진을 사용함) |
mongoDB 내부 (쿼리 처리기에서 C++로 프로그래밍된 집계 연산) |
여기서 애플리케이션의 속도가 왜 느리고, 파이프라인에서의 처리가 왜 빠른지를 생각해보면,
많은 양의 데이터를 미리 처리한 후에 앱단으로 보내므로 빠른 것이고, 데이터를 가공하지 않고 모두 앱단에 보낸 후 앱단에서 처리하는 것의 차이라고 볼 수 있다.
그런데 램 사용량은 JS엔진도 많이 필요하고, 앱단에서 처리해도 많이 필요하다. 왜냐하면 어쨌거나 정보가 처음 들어오는 쿼리 처리기에서 파이프라인으로 처리하지 않고, JS 엔진으로 한 번 모든 데이터를 넘겨주는 시점에서 램 사용량이 늘어가고, 이를 또 다시 앱단으로 넘기려면 더 많은 램이 요구된다.
대부분의 상황에서는 파이프라인을 사용하는 것이 좋고, 파이프라인에서 처리할 수 없는 처리가 있다면 맵/리듀스 방식을 고려해보고 그 다음으로 어플리케이션 단의 처리를 고려해봐야 한다.
'DB, ORM > 🍃 mongoDB (shell)' 카테고리의 다른 글
집계 명령어 활용하기 (3) Aggregate 파이프라인 (ii) 👨🏫 고급(?) stage (0) | 2020.07.25 |
---|---|
집계 명령어 활용하기 (3) Aggregate 파이프라인 (i) 👨🏫 기본적인 stage (0) | 2020.07.24 |
projection 연산자 (0) | 2020.07.24 |
쿼리 작성하기 (논리/비교 연산자, 문자열 연산자, 배열 연산자) (0) | 2020.07.24 |
원자성을 유지를 위한 Transaction(트랜잭션) + WriteConcern/ReadConcern (0) | 2020.07.24 |