[MongoDB] 최대, 최소값 가져오기

최대값이나 최소값을 가져오는 방법을 간략하게 다뤄보겠다.



표준적인 방법

표면적으로 제공되는 기능을 활용한다면, 보통은 aggregate 함수의 max 기능을 사용할 수 있을 것이다.
아래의 함수 호출은 말 최대값만 aggregate 연산으로 가져오는 간단한 코드다.

.aggregate({ $group : { _id: null, max: { $max : "$대상키" }}});

최대나 최소나 문제없이 동작한다.
이게 최선이냐? 하면 그렇지는 않다.

어째서인지 모르겠지만 몽고DB는 이런 단순한 aggregate 문에 대해서도 충분한 최적화를 하고 있지 못하기 때문이다.
이 코드는 인덱스가 있더라도 무조건 O(n)의 선형 연산을 한다.




더 빠른 방법

더 빠르고 효율적인 방법은 그냥 정렬한다음에 하나만 잘라오는 것이다.

.find().sort({대상키:-1}).limit(1).toArray()[0].대상키

대상키에 인덱스가 걸려있는 상태에서 이렇게 쿼리를 날리면, 몽고는 인덱스만 참조해서 바로 값을 던진다. 따라서 복잡도는 O(1)이 된다...



참조
https://stackoverflow.com/questions/32076382/mongodb-how-to-get-max-value-from-collections