[MongoDB] aggregate: ๊ธฐ๋ณธ ๊ตฌ์กฐ
mongodb๋ aggregate๋ผ๋ ๊ธฐ๋ฅ์ ํตํด์ aggregation ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๊ธฐ์กด์๋ map-reduce๋ฅผ ํตํด์ ์ด๋ฐ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ์๋๋ฐ, ๊ทธ๊ฑธ ์ ๊ฑฐํ๊ณ ์ด๊ฑธ๋ก ๋์ฒดํ ์ํ๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๋ง์ฝ ์ด๋ฐ ํํ์ ๋ฐ์ดํฐ์
์ด ์๋ค๋ฉด
aggregate๋ ๋ฐฐ์ด์ ํํ๋ก ์ฌ๋ฌ๊ฐ์ ์คํ
์ ์์๋๋ก ์ ์ํด์, ํ์ดํ๋ผ์ธ์ฒ๋ผ ์
์ถ๋ ฅ์ ๋ฝ์๋ด๋ ํํ๋ก ๋์ํ๋ค.
ํ๋์ฉ ๋ฏ์ด๋ณด์.
match ์คํ
๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ stage๋ค. ์ด๊ฑด ๋ง ๊ทธ๋๋ก ํํฐ ์ญํ ๋ง์ ์ํํ๋ค.
๊ธฐ๋ณธ์ ์ธ find ์ ๊ณผ ๋ค๋ฅผ๊ฒ ์๋ค.
skip๊ณผ limit
Limit์ Offset์ ๊ตฌํํ๋ stage๋ค.
๋ณ๋ก ํน๋ณํ ๊ฑด ์๋ค.
project ์คํ
์ด๊ฑด ํ๋์ ๋ํด์ ํ๋ก์ ์ ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
ํน์ ํ๋๋ง ๊ณจ๋ผ๋ด์ ๋ค์ ์คํ
์ผ๋ก ๋๊ธด๋ค. ๋ฝ์๊ฒ๋ง ๋ฝ์์ ๋ฏธ๋ฆฌ ๋๊ธฐ๋ฉด ์ฌ์ด์ฆ๊ฐ ์์์ง๊ธฐ ๋๋ฌธ์, ์ต์ ํ๋ฅผ ์ํด์ ์ฌ์ฉ๋๋ค.
unwind ์คํ
์ด๊ฑด ๋ฐฐ์ด ํ๋๋ฅผ ๊ฐ์ ๋ก ํผ์ณ๋ด๋ ํน์ํ ๊ธฐ๋ฅ์ด๋ค.
๋ง์ฝ ์ด๋ฐ ๋ฐฐ์ด ํ๋๊ฐ ์๋ค๋ฉด
๊ทธ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ ๊ฒ row ๋จ์๋ฅผ ๊ฐ์ ๋ก ์ชผ๊ฐค ์ ์๋ค.
group ์คํ
group by๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ผ๋จ ๊ทธ๋ฃน์ด ๋๋ ๊ธฐ์ค์ ์ ์ ์ํด์ผ ํ๋๋ฐ, ๊ทธ๊ฒ ์ฌ๊ธฐ์๋ _id๋ผ๋ ๊ธฐ๋ณธํค๋ก ๊ณ ์ ๋์ด์๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ์ง๊ณ๋๋ ๊ฐ๋ค์ ๋ค๋ฅธ ํ๋๋ก ์ ์ํ๊ณ , ๊ฐ์ ๊ณ์ฐํ๊ฒ ํ๋ฉด ๋๋ค.
์ด๊ฑด ๊ฐ row์ ๋ํด์ 1๋ก ์น๊ณ ์ ํฉ์ฐํ๋ค๋ ๋ป์ด๋ค. ๊ทธ๋ฌ๋๊น ๊ฒฐ๊ตญ์๋ count ์ฟผ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.

์ด ๊ฒฝ์ฐ์๋ shopTaskItem.price๋ฅผ ํฉ์ฐํ๋๋ก ํ๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ๋ฃน ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฒฉ์ด ํฉ์ฐ๋๋ค.
์ด์ธ์๋ avg๋ ์๊ณ ์ฐ์ฐ์๊ฐ ์ด๊ฒ์ ๊ฒ ์๋ค.
๋๋จธ์ง๋ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.
sort ์คํ
์ ๋ ฌ์ ์ํ ๊ธฐ๋ฅ์ด๋ค.
-1๋ก ์ฃผ๋ฉด ์ญ์์ด๊ณ , 1๋ก ์ฃผ๋ฉด ์ค๋ฆ์ฐจ์์ ๋ ฌ์ด๋ค.
๊ธฐ๋ณธ์ ์ธ step, ๊ทธ๋ฌ๋๊น stage๋ค์ ์ด์ ๋๋ค.
๋ ๋ง๊ธด ํ๋ฐ, ์ด์ ๋๊ฐ ์์ฃผ ์ฐ์ด๋ ๊ฒ๋ค์ด๋ค.
๋๋จธ์ง๋ ๋ณ๋ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.
https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/#std-label-aggregation-pipeline-operator-reference
๋จ์
MongoDB๋ฅผ ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ ์๊ฐ์ด ์๋ค๋ฉด, ์ผ๋จ ์ด๊ฑธ ๋จผ์ ํ์ธํด๋ด์ผ ํ๋ค.
์ฑ๋ฅ
์ผ๋จ ์ด๊ฑฐ ๋ณ๋ก ๋น ๋ฅด์ง ์๋ค. RDB์ ๋น๊ตํ๋ฉด ์ฒด๊ฐ์ ์คํ๋ ค ๋ ๋๋ฆฐ ๊ฒ ๊ฐ๋ค.
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ ํ
๊ฐ์ฅ ์น๋ช
์ ์ธ ๋ฌธ์ ๋ค. ๋๋๊ฒ๋, aggregate์ ๊ฐ ์คํ
์ 100MB๋ผ๋ ํ๋์ฝ๋ฉ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ฐ๊ณ ์๋ค.
์ด ์ ํ์ ๋์ด์๋ฉด ์ด๋ป๊ฒ ๋๋๋ ํ๋ฉด, ๊ทธ๋ฅ ์คํ
์ด ์ฒ๋ฆฌ๋์ง ์๊ณ ์ ๋งคํ ๊ฐ์ ๋ญ๊ฐ์ ๋ฐํํ๋ค.
์ค๋ฅ๋ฅผ ๋ฐํํ์ง๋ ์๊ณ , ๊ทธ๋ฅ ์๋ต์ ๋ง๊ฐ๋จ๋ ค์ ๋ฐํํ๋ ๊ฒ์ด๋ค. ์ฐธ์ผ๋ก mongo์ค๋ฝ๋ค๊ณ ํ ์ ์๋ค.
๊ทธ๋์ ๋น ๋ฐ์ดํฐ๋ ์ปค๋ ๋ฏธ๋์๊ธ ๋ฐ์ดํฐ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค. ์กฐ๊ธ์ด๋ผ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋จ์๊ฐ ์ปค์ง ์ ์๋ค๋ฉด, aggregate ๊ธฐ๋ฅ์ ์์กดํ์ง ์๊ณ ์ง์ ์์ฉํ๋ก๊ทธ๋จ ๋ ๋ฒจ์์ ์ง์ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผํ ๋๋ฅผ ๋๋นํด์ useDisk... ๊ฐ์ ๋์คํฌ ์ฌ์ฉ ์ต์ ์ด ์๋๋ฐ, ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํด ๋์ํ๋ ๊ฒ๋ ์๋ ๊ฒ ๊ฐ๊ณ , ์ ์๋จนํ๋๋ผ. ์ ๋๋ก ๋ง๋ ๊ฑด์ง๋ ์์ฌ์ค๋ฝ๋ค.
์ฐธ์กฐ
https://www.mongodb.com/docs/manual/core/aggregation-pipeline/
https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/#std-label-aggregation-pipeline-operator-reference