[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