MongoDB에서 다중 Counting 연산

2022. 4. 3. 04:52서버 프로그래밍

다수의 레코드에 대한 각각의 Counting을 해야하는 상황이라 무식하게 count() 수십번 호출하는 것보다 aggregation을 이용하여 처리하고자 했다. $facet를 이용하면 싱글 스테이지에서 다중 aggregation 파이프라인을 동작할 수 있기 때문에 이 방법을 사용해보았다. 그런데... 

https://stackoverflow.com/questions/52088666/multiple-counts-with-single-query-in-mongodb

 

Multiple Counts with single query in mongodb

I am new to Mongo Db and would appreciate some help with this query. I have been sifting through posts here for the past couple of days tearing my hair to see if I could find anything related to my...

stackoverflow.com

$count aggregation will always give you the counts for only single matching ($match) condition. So you need to further divide your each count into multiple section and that's what the $facet provides by processes multiple aggregation pipelines within a single stage on the same set of input documents.

db.collection.aggregate([
  { "$facet": {
    "Total": [
      { "$match" : { "ReleaseDate": { "$exists": true }}},
      { "$count": "Total" },
    ],
    "Released": [
      { "$match" : {"ReleaseDate": { "$exists": true, "$nin": [""] }}},
      { "$count": "Released" }
    ],
    "Unreleased": [
      { "$match" : {"ReleaseDate": { "$exists": true, "$in": [""] }}},
      { "$count": "Unreleased" }
    ]
  }},
  { "$project": {
    "Total": { "$arrayElemAt": ["$Total.Total", 0] },
    "Released": { "$arrayElemAt": ["$Released.Released", 0] },
    "Unreleased": { "$arrayElemAt": ["$Unreleased.Unreleased", 0] }
  }}
])
[{
    "Total": 3,
    "Released": 2,
    "Unreleased": 1
}]

의도한대로 결과가 나왔지만... 처리 속도가 너무 느렸다.

인덱스를 걸었음에도, 인덱스를 걸지 않고 무식하게 count()를 하는 경우와 비슷한 처리 속도가 나오는 것이다.

그래서 결과적으로 인덱스를 걸고 무식하게 count()를 수십차례 돌리는 것이 훨씬 더 빠른 결과가 나와서 이 방법으로 마무리했다.

다음 블로그에서 힌트를 얻었다. $facet 연산자는 index를 사용하지 않는단다.

두 번째로, $facet을 사용했던 aggregate에 대한 쿼리 최적화를 진행해보자.
우선적으로, $facet 연산자는 하나의 스테이지 내에서 또 다른 서브 스테이지를 만들 수 있는 연산자이기 때문에 index를 활용할 줄 알았다.
하지만 검색 결과 index를 사용하지 않기 때문에 해당 두 하위 그룹들이 공통으로 가지고 있는 $match 스테이지를 올려야 한다.

https://gonewbie.github.io/2019/12/16/how-to-optimize-mongodb-query-aggregate/

 

mongodb aggregate 쿼리 최적화 · gonewbie's Studio

Word count: 2.8kReading time: 17 min  2019/12/16  Share     

gonewbie.github.io

다음은 인덱스 관련 참고자료.

https://ryu-e.tistory.com/1

 

MongoDB index 개념과 indexing 전략

 이번 시간에는 mongodb index에 대해 알아보려고 합니다. 어떤 조회 쿼리를 추가했는데 그 쿼리가 너무 느렸던 경험과 기존 프로젝트에 조회 쿼리가 데이터가 쌓일수록 느려져 문제가 되었던 적이

ryu-e.tistory.com