본문 바로가기
DB/mongoDB

몽고디비는 group by를 사용할 수 없을까?

by code_yull 2022. 7. 22.

몽고디비를 사용한 프로젝트에서 원하는 조건의 데이터를 조회해오기 위해서는 find 쿼리를 사용합니다

그렇지만 기존의 find 쿼리는 복잡한 조건을 적용시켜주거나, 데이터값을 가공시켜주기에는 적합하지 않습니다.

기존의 find 쿼리로는 group by를 사용할 수 없죠.

그러면 몽고디비는 group by를 사용할 수 없을까요?

아닙니다! aggregate를 사용해보세요!

aggregate는 기본적으로 pipeline 구조를 사용합니다.

여러개의 stage로 이루어진 pipeline을 구성할 수 있고, 전 stage를 거친 결과가 다음 stage로 넘어가는 식입니다.

어떤 스테이지가 있는지는 미리 정해져있고, 필요한 가공/조회 작업들을 해주는 스테이지들을 적절하게 배치해주면 됩니다.

많이 쓰이는 stage들을 몇가지 소개해볼까 합니다.

** aggregate에서 사용할 수 있는 쿼리가 있고, 없는 쿼리가 있습니다.
공식문서를 참고하여, 사용할 수 있는 연산자를 확인한 후 사용해야 합니다.

  1. $group
    나왔다 groupby! 특정 필드의 값을 기준으로 하여 group으로 묶어주는 stage입니다.
    sql에서처럼 연산 operater를 사용하여 연산값을 리턴하도록 할 수도 있습니다.
  2. $match
    일반 find함수와 같이 조건문에 맞는 데이터를 찾아주는 stage입니다.
    stage를 구성할 때, match를 앞쪽에 배치해주면, 일반적으로 뒤 stage에서 처리해줘야할 데이터의 양이 줄어들어 더 효율적입니다.
  3. $sort
    SQL문에서의 DESC 처럼 특정 필드의 값들을 기준으로 나열해주는 stage입니다.
    db에서 데이터를 가져온 후 백엔드 단에서 나열 처리를 해주는 작업은 비효율적이니, db에서 데이터를 가져올 때부터 sort를 써주도록 합시다.
  4. $project
    이 stage에서는 결과로 가져온 데이터에서 어떤 필드를 보여주고, 어떤 필드를 보여주지 않을지 결정할 수 있습니다.
    project stage에서는 기존 필드의 값을 새로운 필드를 생성하여 값으로 넣어줄 수도 있습니다.
  5. $random
    난수를 생성해서 해당 수만큼 skip하는 방식으로 하지 않아도, 자동적으로 랜덤 n개의 데이터를 가져올 수있도록 해주는 stage입니다.
    뮤멘트 서비스의 홈 화면에서, 리프래쉬할 때마다 랜덤으로 3개의 뮤멘트를 가져오는 로직을 구현했는데요,
    해당 로직의 쿼리문을 짤 때 아주 유용하게 사용할 수 있었습니다.

처음 보기에는 이해하기 어려울 수 있지만, 알수록 유용한 aggregate쿼리.

기본 개념만 알고 있으면, 필요할 때마다 공식 문서에서 사용가능한 쿼리들을 찾아보며 유용하게 활용할 수 있습니다.


참고자료

https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/

 

Aggregation Pipeline Stages — MongoDB Manual

Docs Home → MongoDB ManualIn the db.collection.aggregate() method and db.aggregate() method, pipeline stages appear in an array. Documents pass through the stages in sequence.All except the $out, $merge, and $geoNear stages can appear multiple times in a

www.mongodb.com

https://www.mongodb.com/docs/manual/reference/operator/aggregation/

 

Aggregation Pipeline Operators — MongoDB Manual

Docs Home → MongoDB ManualFor details on specific operator, including syntax and examples, click on the specific operator to go to its reference page.These expression operators are available to construct expressions for use in the aggregation pipeline st

www.mongodb.com

 

댓글