db.collection.mapReduce()
์ด ํ์ด์ง์ ๋ด์ฉ
์ฐธ๊ณ
๋งต ๋ฆฌ๋์ค์ ๋์์ผ๋ก์์ ์ง๊ณ ํ์ดํ๋ผ์ธ
MongoDB 5 ๋ถํฐ ์์.0 ๋งต ๋ฆฌ๋์ค ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋งต ๋ฆฌ๋์ค ๋์ aggregation pipeline์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. aggregation pipeline์ ๋งต ๋ฆฌ๋์ค๋ณด๋ค ์ฑ๋ฅ๊ณผ ์ ์ฉ์ฑ ์ธก๋ฉด์์ ๋ ์ฐ์ํฉ๋๋ค.
4}
$group
$merge
, ๋ฑ๊ณผ ๊ฐ์ ์ง๊ณ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ๋งต ์ถ์ ์ฐ์ฐ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.์ฌ์ฉ์ ์ง์ ๊ธฐ๋ฅ์ด ํ์ํ ๋งต ๋ฆฌ๋์ค ์์ ์ ๊ฒฝ์ฐ
$accumulator
๋ฐ$function
์ง๊ณ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ JavaScript์์ ์ฌ์ฉ์ ์ง์ ์ง๊ณ ํํ์์ ์ ์ํ ์ ์์ต๋๋ค.
๋งต ๋ฆฌ๋์ค ๋์์ผ๋ก์์ ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ํ์ดํ๋ผ์ธ ์์๋ ๋ค์์ ์ฐธ์กฐํ์ธ์.
db.collection.mapReduce(map,reduce, { <options> })
์ค์
Mongo์ฌ ๋ฐฉ๋ฒ
์ด ํ์ด์ง์์๋
mongosh
๋ฉ์๋๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น ๋๋ Node.js์ ๊ฐ์ ์ธ์ด๋ณ ๋๋ผ์ด๋ฒ์ ๋ํ ์ค๋ช ์๊ฐ ์๋๋๋ค.๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น์ ๋ํด์๋
mapReduce
๋ช ๋ น์ ์ฐธ์กฐํ์ญ์์ค.MongoDB API ๋๋ผ์ด๋ฒ์ ๊ฒฝ์ฐ ์ธ์ด๋ณ MongoDB ๋๋ผ์ด๋ฒ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฐธ๊ณ
๋ทฐ๋ ๋งต ์ถ์ ์์ ์ ์ง์ํ์ง ์์ต๋๋ค.
๊ตฌ๋ฌธ
์ฐธ๊ณ
MongoDB๋ ์์ธํ ์ ๋ณด ํ์ ์ต์ ์ ๋ฌด์ํฉ๋๋ค.
๋ฒ์ 4.2๋ถํฐ MongoDB๋ ๋ค์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ ์ค๋ ์ปฌ๋ ์ ์ ์์ฑํ๋ ๋งต ๋ฆฌ๋์ค ์ต์ ์ ๋ฌผ๋ก ๋งต ๋ฆฌ๋์ค๋ฅผ ์ํ ์ค๋ฉ ์ต์ ๋ ์ฌ์ฉํฉ๋๋ค. ์ค๋ ์ปฌ๋ ์ ์ผ๋ก ์ถ๋ ฅํ๋ ค๋ฉด ๋จผ์ ์ค๋ ์ปฌ๋ ์ ์ ์์ฑํ์ธ์. ๊ฒ๋ค๊ฐ MongoDB 4.2๋ ๊ธฐ์กด ์ค๋ ์ปฌ๋ ์ ์ ๊ต์ฒด๋ฅผ ๋ ์ด์ ์ง์ํ์ง ์์ต๋๋ค.
db.collection.mapReduce()
์ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
db.collection.mapReduce( <map>, <reduce>, { out: <collection>, query: <document>, sort: <document>, limit: <number>, finalize: <function>, scope: <document>, jsMode: <boolean>, verbose: <boolean>, bypassDocumentValidation: <boolean> } )
db.collection.mapReduce()
๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋งค๊ฐ ๋ณ์ | ์ ํ | ์ค๋ช
|
---|---|---|
map | JavaScript ๋๋ ๋ฌธ์์ด |
์์ธํ ๋ด์ฉ์ ์ง๋ ๊ธฐ๋ฅ์ ์๊ตฌ ์ฌํญ์ ์ฐธ๊ณ ํ์ธ์. |
reduce | JavaScript ๋๋ ๋ฌธ์์ด | ํน์ ์์ธํ ๋ด์ฉ์ ๋ฆฌ๋์ค ํจ์์ ์๊ตฌ ์ฌํญ์ ์ฐธ์กฐํ์ธ์. |
options | ๋ฌธ์ | db.collection.mapReduce() ์ ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๋ ๋ฌธ์์
๋๋ค. |
๋ค์ ํ์์๋ db.collection.mapReduce()
๊ฐ ์๋ฝํ ์ ์๋ ์ถ๊ฐ ์ธ์์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
ํ๋ | ์ ํ | ์ค๋ช
| ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
out | ๋ฌธ์์ด ๋๋ ๋ฌธ์ | ๋งต ๋ฆฌ๋์ค ์์
๊ฒฐ๊ณผ์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. collection์ผ๋ก ์ถ๋ ฅํ๊ฑฐ๋, ์กฐ์น๋ฅผ ์ฌ์ฉํ์ฌ collection์ผ๋ก ์ถ๋ ฅํ๊ฑฐ๋, ์ธ๋ผ์ธ์ผ๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ธํธ์ ํ๋ผ์ด๋จธ๋ฆฌ ๋
ธ๋์ ๋ํด ๋งต ๋ฆฌ๋์ค ์์
์ ์ํํ ๋ collection์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ธ์ปจ๋๋ฆฌ ๋
ธ๋์์๋ ์์ธํ ๋ด์ฉ์ out ์ต์ ์ ์ฐธ์กฐํ์ธ์. | ||||||||||
query | ๋ฌธ์ | map ํจ์์ ์
๋ ฅ๋ ๋ฌธ์๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ๊ธฐ์ค์ ์ง์ ํฉ๋๋ค. | ||||||||||
sort | ๋ฌธ์ | ์
๋ ฅ ๋ฌธ์๋ฅผ ์ ๋ ฌํฉ๋๋ค. ์ด ์ต์
์ ์ต์ ํ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ๋ ฌ ํค๋ฅผ ๋ด๋ณด๋ด๊ธฐ ํค์ ๋์ผํ๊ฒ ์ง์ ํ์ฌ ์ถ์ ์์
์ ์ค์ด๋๋ก ํ ์ ์์ต๋๋ค. ์ ๋ ฌ ํค๋ ์ด ์ปฌ๋ ์
์ ๊ธฐ์กด ์ธ๋ฑ์ค์ ์์ด์ผ ํฉ๋๋ค. | ||||||||||
limit | ์ซ์ | map ํจ์์ ์
๋ ฅํ ์ ์๋ ์ต๋ ๋ฌธ์ ์๋ฅผ ์ง์ ํฉ๋๋ค. | ||||||||||
finalize | JavaScript ๋๋ ๋ฌธ์์ด | ์ ํ ์ฌํญ. ์์ธํ ๋ด์ฉ์ finalize ํจ์ ์๊ตฌ ์ฌํญ์ ์ฐธ์กฐํ์ธ์. | ||||||||||
scope | ๋ฌธ์ | map , reduce ๋ฐ finalize ํจ์์์ ์ก์ธ์คํ ์ ์๋ ๊ธ๋ก๋ฒ ๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค. | ||||||||||
jsMode | ๋ถ์ธ |
๊ธฐ๋ณธ๊ฐ์
| ||||||||||
verbose | ๋ถ์ธ | ๊ฒฐ๊ณผ ์ ๋ณด์ ๊ธฐ๋ณธ๊ฐ์ MongoDB 4.4๋ถํฐ๋ ์ด ์ต์
์ด ๋ฌด์๋ฉ๋๋ค. ๊ฒฐ๊ณผ ์ ๋ณด์๋ ํญ์ | ||||||||||
collation | ๋ฌธ์ | ์ ํ ์ฌํญ. ์์ ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ฉด ๋์๋ฌธ์ ๋ฐ ์ ์ผํธ ํ์ ๊ท์น๊ณผ ๊ฐ์ ๋ฌธ์์ด ๋น๊ต์ ๋ํ ์ธ์ด๋ณ ๊ท์น์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ ์ต์ ์ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์ง์ ๋์ง ์์์ง๋ง ์ปฌ๋ ์
์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์๋ ๊ฒฝ์ฐ( ์ปฌ๋ ์ ๋๋ ์ฐ์ฐ์ ๋ํ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, MongoDB๋ ์ด์ ๋ฒ์ ์์ ๋ฌธ์์ด ๋น๊ต์ ์ฌ์ฉ๋ ๊ฐ๋จํ ์ด์ง ๋น๊ต๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ์ฐ์ฐ์ ๋ํด ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋๋ณ๋ก ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ผ๋ฉฐ ์ ๋ ฌ๊ณผ ํจ๊ป ์ฐพ๊ธฐ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ์ ์ ๋ ฌ์์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ฒ์ 3.4์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. | ||||||||||
bypassDocumentValidation | ๋ถ์ธ | ์ ํ ์ฌํญ. ๋ฒ์ 3.2์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. |
์ฐธ๊ณ
map-reduce operations
๋ฐ $where
์ฐ์ฐ์ ํํ์์ mongosh
์์ ์ฌ์ฉํ ์ ์๋ db
์ ๊ฐ์ ํน์ ๊ธ๋ก๋ฒ ํจ์ ๋๋ ์์ฑ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
$where
๋ฐ ์ฐ์ฐ์ map-reduce operations
ํํ์์ ๋ค์ JavaScript ํจ์ ๋ฐ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ | ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ | |
---|---|---|
args MaxKey MinKey | assert() BinData() DBPointer() DBRef() doassert() emit() gc() HexData() hex_md5() isNumber() isObject() ISODate() isString() | Map() MD5() NumberInt() NumberLong() ObjectId() print() printjson() printjsononeline() sleep() Timestamp() tojson() tojsononeline() tojsonObject() UUID() version() |
ํจ์์ ๋ํ map
์๊ตฌ ์ฌํญ
map
ํจ์๋ ๊ฐ ์
๋ ฅ ๋ฌธ์๋ฅผ 0๊ฐ ์ด์์ ๋ฌธ์๋ก ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค. scope
๋งค๊ฐ๋ณ์์ ์ ์๋ ๋ณ์์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ํ๋กํ ํ์
์ด ์์ต๋๋ค.
function() { ... emit(key, value); }
map
ํจ์์๋ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
map
ํจ์์์ ํ์ฌ ๋ฌธ์๋ฅผ ํจ์ ๋ด์this
๋ก ์ฐธ์กฐํฉ๋๋ค.map
ํจ์๋ ์ด๋ค ์ด์ ๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํด์๋ ์๋ฉ๋๋ค.map
ํจ์๋ ์์ํด์ผ ํ๊ฑฐ๋ ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํฉ๋๋ค(์: ๋ถ์์ฉ).map
ํจ์๋ ์ ํ์ ์ผ๋กemit(key,value)
๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ์ฌkey
์value
๋ฅผ ์ฐ๊ฒฐํ๋ ์ถ๋ ฅ ๋ฌธ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋ค์ map
ํจ์๋ ์
๋ ฅ ๋ฌธ์์ status
ํ๋ ๊ฐ์ ๋ฐ๋ผ emit(key,value)
๋ฅผ 0ํ ๋๋ 1ํ ํธ์ถํฉ๋๋ค.
function() { if (this.status == 'A') emit(this.cust_id, 1); }
๋ค์ map
ํจ์๋ ์
๋ ฅ ๋ฌธ์์ items
ํ๋์ ์๋ ์์ ์์ ๋ฐ๋ผ emit(key,value)
๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ์ ์์ต๋๋ค.
function() { this.items.forEach(function(item){ emit(item.sku, 1); }); }
ํจ์์ ๋ํ reduce
์๊ตฌ ์ฌํญ
reduce
ํจ์์ ํ๋กํ ํ์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function(key, values) { ... return result; }
reduce
ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ๋ํ๋
๋๋ค.
reduce
ํจ์๋ ์ฝ๊ธฐ ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํด์๋ ์๋ฉ๋๋ค.reduce
ํจ์๋ ์ธ๋ถ ์์คํ ์ ์ํฅ์ ์ฃผ์ด์๋ ์๋ฉ๋๋ค.MongoDB๋ ๋์ผํ ํค์ ๋ํด
reduce
ํจ์๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋น ํค์ ๋ํreduce
ํจ์์ ์ด์ ์ถ๋ ฅ์ ํด๋น ํค์ ๋ํ ๋ค์reduce
ํจ์ ํธ์ถ์ ๋ํ ์ ๋ ฅ ๊ฐ ์ค ํ๋๊ฐ ๋ฉ๋๋ค.reduce
ํจ์๋scope
๋งค๊ฐ๋ณ์์ ์ ์๋ ๋ณ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค.reduce
์ ๋ํ ์ ๋ ฅ์ MongoDB์ ์ต๋ BSON ๋ฌธ์ ํฌ๊ธฐ ์ ๋ฐ๋ณด๋ค ํฌ์ง ์์์ผ ํฉ๋๋ค. ํฐ ๋ฌธ์๊ฐ ๋ฐํ๋ ํ ํ์reduce
๋จ๊ณ์์ ํจ๊ป ๊ฒฐํฉ๋๋ฉด ์ด ์๊ตฌ ์ฌํญ์ ์๋ฐํ ์ ์์ต๋๋ค.
๋์ผํ ํค์ ๋ํด reduce
ํจ์๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ๋ค์ ์์ฑ์ด ์ฐธ์ด์ฌ์ผ ํฉ๋๋ค.
๋ฐํ ๊ฐ์ฒด์ ์ ํ์
map
ํจ์์์ ๋ฐฉ์ถํvalue
์ ์ ํ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค.reduce
ํจ์๋ ์ฐ๊ด์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ๋ค์ ์ค๋ช ์ด ์ฐธ์ด์ด์ผ ํฉ๋๋ค.reduce(key, [ C, reduce(key, [ A, B ]) ] ) == reduce( key, [ C, A, B ] ) reduce
ํจ์๋ ๋ฉฑ๋ฑ์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ๋ค์ ์ค๋ช ์ด ์ฐธ์ด์ด์ผ ํฉ๋๋ค.reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray ) reduce
ํจ์๋ ๊ฐํ์ ์ด์ด์ผ ํฉ๋๋ค. ์ฆ,valuesArray
์์์ ์์๊ฐreduce
ํจ์์ ์ถ๋ ฅ์ ์ํฅ์ ์ฃผ์ง ์์์ผ ํ๋ฏ๋ก ๋ค์ ๋ช ๋ น๋ฌธ์ด ์ฐธ์ด์ด์ผ ํฉ๋๋ค.reduce( key, [ A, B ] ) == reduce( key, [ B, A ] )
out
์ต์
out
๋งค๊ฐ๋ณ์์ ๋ํด ๋ค์ ์ต์
์ ์ง์ ํ ์ ์์ต๋๋ค.
์ปฌ๋ ์ ์ผ๋ก ์ถ๋ ฅ
์ด ์ต์ ์ ์ ์ปฌ๋ ์ ์ผ๋ก ์ถ๋ ฅ๋๋ฉฐ ๋ณต์ ๋ณธ ์ธํธ์ ์ธ์ปจ๋๋ฆฌ ๋ ธ๋์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
out: <collectionName>
์์ ์ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ ์ผ๋ก ์ถ๋ ฅ
์ฐธ๊ณ
๋ฒ์ 4.2๋ถํฐ MongoDB๋ ๋ค์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ ์ค๋ ์ปฌ๋ ์ ์ ์์ฑํ๋ ๋งต ๋ฆฌ๋์ค ์ต์ ์ ๋ฌผ๋ก ๋งต ๋ฆฌ๋์ค๋ฅผ ์ํ ์ค๋ฉ ์ต์ ๋ ์ฌ์ฉํฉ๋๋ค. ์ค๋ ์ปฌ๋ ์ ์ผ๋ก ์ถ๋ ฅํ๋ ค๋ฉด ๋จผ์ ์ค๋ ์ปฌ๋ ์ ์ ์์ฑํ์ธ์. ๊ฒ๋ค๊ฐ MongoDB 4.2๋ ๊ธฐ์กด ์ค๋ ์ปฌ๋ ์ ์ ๊ต์ฒด๋ฅผ ๋ ์ด์ ์ง์ํ์ง ์์ต๋๋ค.
์ด ์ต์
์ out
์ ์ด๋ฏธ ์กด์ฌํ๋ ์ปฌ๋ ์
์ ์ ๋ฌํ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ณต์ ๋ณธ ์ธํธ์ ์ธ์ปจ๋๋ฆฌ ๋
ธ๋๋ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
out: { <action>: <collectionName> [, db: <dbName>] [, sharded: <boolean> ] }
์์
์ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
์ ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ out
์๋ ๋ค์๊ณผ ๊ฐ์ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
<action>
: ๋ค์ ์์ ์ค ํ๋๋ฅผ ์ง์ ํฉ๋๋ค.replace
<collectionName>
์ด ์๋ ์ปฌ๋ ์ ์ด ์๋ ๊ฒฝ์ฐ<collectionName>
์ ๋ด์ฉ์ ๋ฐ๊ฟ๋๋ค.merge
์ถ๋ ฅ ์ปฌ๋ ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ๊ฒฐ๊ณผ์ ๋ณํฉํฉ๋๋ค. ๊ธฐ์กด ๋ฌธ์์ ์ ๊ฒฐ๊ณผ์ ๋์ผํ ํค๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์๋๋ค.
reduce
์ถ๋ ฅ ์ปฌ๋ ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ๊ฒฐ๊ณผ์ ๋ณํฉํฉ๋๋ค. ๊ธฐ์กด ๋ฌธ์์ ์ ๊ฒฐ๊ณผ์ ๋์ผํ ํค๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๋ฌธ์์ ๊ธฐ์กด ๋ฌธ์ ๋ชจ๋์
reduce
ํจ์๋ฅผ ์ ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ก ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์๋๋ค.
db
:์ ํ ์ฌํญ์ ๋๋ค. ๋งต ๋ฆฌ๋์ค ์์ ์ผ๋ก ์ถ๋ ฅ์ ๊ธฐ๋กํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ๋ ฅ ์ปฌ๋ ์ ๊ณผ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฉ๋๋ค.
์ธ๋ผ์ธ ์ถ๋ ฅ
๋ฉ๋ชจ๋ฆฌ์์ ๋งต ๋ฆฌ๋์ค ์ฐ์ฐ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ์ต์
์ ๋ณต์ ๋ณธ ์ธํธ์ ์ธ์ปจ๋๋ฆฌ ๋
ธ๋์์ out
์ ๋ํด ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ์ต์
์
๋๋ค.
out: { inline: 1 }
๊ฒฐ๊ณผ๋ BSON ๋ฌธ์์ ์ต๋ ํฌ๊ธฐ์ ๋ง์์ผ ํฉ๋๋ค.
ํจ์์ ๋ํ finalize
์๊ตฌ ์ฌํญ
finalize
ํจ์์ ํ๋กํ ํ์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function(key, reducedValue) { ... return modifiedObject; }
finalize
ํจ์๋ ์ธ์๋ก reduce
ํจ์์ key
๊ฐ๊ณผ reducedValue
๋ฅผ ๋ฐ์ต๋๋ค. ๋ค์ ์ฌํญ์ ์ ์ํ์ธ์.
finalize
ํจ์๋ ์ด๋ค ์ด์ ๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํด์๋ ์๋ฉ๋๋ค.finalize
ํจ์๋ ์์ํด์ผ ํ๊ฑฐ๋ ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํฉ๋๋ค(์: ๋ถ์์ฉ).finalize
ํจ์๋scope
๋งค๊ฐ๋ณ์์ ์ ์๋ ๋ณ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๋งต-๋ฆฌ๋์ค ์์
์ด ์น์ ์ ์์ ๋ ์ฌ์ฉ์ ์ง์ ์ง๊ณ ํํ์์ด ์๋ ์ง๊ณ ํ์ดํ๋ผ์ธ ๋์์ ์ ์ํฉ๋๋ค.์ฌ์ฉ์ ์ ์ ํํ์์ ์ฌ์ฉํ๋ ๋์์ ๋ํด์๋ ๋งต ๋ฆฌ๋์ค์์ ์ง๊ณ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ณํ ์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด ๋ฌธ์๋ก ์ํ ์ปฌ๋ ์
orders
์ ๋ง๋์ธ์.
db.orders.insertMany([ { _id: 1, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-01"), price: 25, items: [ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" }, { _id: 2, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-08"), price: 70, items: [ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" }, { _id: 3, cust_id: "Busby Bee", ord_date: new Date("2020-03-08"), price: 50, items: [ { sku: "oranges", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" }, { _id: 4, cust_id: "Busby Bee", ord_date: new Date("2020-03-18"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 5, cust_id: "Busby Bee", ord_date: new Date("2020-03-19"), price: 50, items: [ { sku: "chocolates", qty: 5, price: 10 } ], status: "A"}, { _id: 6, cust_id: "Cam Elot", ord_date: new Date("2020-03-19"), price: 35, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, { _id: 7, cust_id: "Cam Elot", ord_date: new Date("2020-03-20"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 8, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 75, items: [ { sku: "chocolates", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, { _id: 9, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 55, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 10, cust_id: "Don Quis", ord_date: new Date("2020-03-23"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" } ])
๊ณ ๊ฐ๋น ์ด ๊ฐ๊ฒฉ ๋ฐํ
orders
์ปฌ๋ ์
์์์ ๋งต ๋ฆฌ๋์ค ์ฐ์ฐ์ ์ํํ์ฌ cust_id
๋ณ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ cust_id
์ ๋ํ price
์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ธ์.
๊ฐ ์ ๋ ฅ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ๋งต ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ธ์.
์ด ํจ์์์
this
๋ ๋งต ๋ฆฌ๋์ค ์์ ์ด ์ฒ๋ฆฌํ๊ณ ์๋ ๋ฌธ์๋ฅผ ๋ํ๋ ๋๋ค.์ด ํจ์๋ ๊ฐ ๋ฌธ์์ ๋ํด
price
์cust_id
์ ๋งคํํ๊ณcust_id
๋ฐprice
์ ์ถ๋ ฅํฉ๋๋ค.
var mapFunction1 = function() { emit(this.cust_id, this.price); }; ๋ ๊ฐ์ ์ธ์
keyCustId
์valuesPrices
์ ์ฌ์ฉํ์ฌ ์์ํ๋ ๋ฆฌ๋์ค ํจ์๋ฅผ ์ ์ํ์ธ์.valuesPrices
๋ ๋งต ํจ์์์ ๋ฐ์ํprice
๊ฐ๋ค๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ด๋ฉฐ, ์ด ๊ฐ๋ค์keyCustId
๋ก ๊ทธ๋ฃนํ๋์ด ์์ต๋๋ค.์ด ํจ์๋
valuesPrice
๋ฐฐ์ด์ ํด๋น ์์์ ํฉ์ผ๋ก ๋ฆฌ๋์คํฉ๋๋ค.
var reduceFunction1 = function(keyCustId, valuesPrices) { return Array.sum(valuesPrices); }; mapFunction1
๋งต ํจ์์reduceFunction1
๋ฆฌ๋์ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌorders
์ปฌ๋ ์ ์ ๋ชจ๋ ๋ฌธ์์ ๋ํด ๋งต-๋ฆฌ๋์ค๋ฅผ ์ํํ์ธ์.db.orders.mapReduce( mapFunction1, reduceFunction1, { out: "map_reduce_example" } ) ์ด ์ฐ์ฐ์
map_reduce_example
์ด๋ผ๋ ์ปฌ๋ ์ ์ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.map_reduce_example
์ปฌ๋ ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด ์ฐ์ฐ์ ํด๋น ์ฝํ ์ธ ๋ฅผ ์ด ๋งต-๋ฆฌ๋์ค ์์ ์ ๊ฒฐ๊ณผ๋ก ๋ฐ๊ฟ๋๋ค.map_reduce_example
์ปฌ๋ ์ ์ ์ฟผ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.db.map_reduce_example.find().sort( { _id: 1 } ) ์ด ์์ ์ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Busby Bee", "value" : 125 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Don Quis", "value" : 155 }
์ง๊ณ ๋์
์ฌ์ฉ ๊ฐ๋ฅํ ์ง๊ณ ํ์ดํ๋ผ์ธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ํจ์๋ฅผ ์ ์ํ์ง ์๊ณ ๋ ๋งต-๋ฆฌ๋์ค ์์ ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
db.orders.aggregate([ { $group: { _id: "$cust_id", value: { $sum: "$price" } } }, { $out: "agg_alternative_1" } ])
$group
๋จ๊ณ๋cust_id
์ผ๋ก ๊ทธ๋ฃนํํ๊ณvalue
ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค ($sum
๋ ์ฐธ์กฐํ์ธ์).value
ํ๋์๋ ๊ฐcust_id
์ ์ดprice
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.์ด ๋จ๊ณ์์๋ ๋ค์ ๋ฌธ์๋ฅผ ๋ค์ ๋จ๊ณ๋ก ์ถ๋ ฅํฉ๋๋ค.
{ "_id" : "Don Quis", "value" : 155 } { "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Busby Bee", "value" : 125 } ๊ทธ๋ฐ ๋ค์
$out
์ ๊ฒฐ๊ณผ๋ฅผagg_alternative_1
์ปฌ๋ ์ ์ ์๋๋ค.$out
๋์$merge
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.agg_alternative_1
์ปฌ๋ ์ ์ ์ฟผ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.db.agg_alternative_1.find().sort( { _id: 1 } ) ์ด ์์ ์ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Busby Bee", "value" : 125 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Don Quis", "value" : 155 }
ํ
๋ค์๋ ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ์ ์ ์ ์ง๊ณ ํํ์์ ์ฌ์ฉํ๋ ๋์์ ๋งต-๋ฆฌ๋์ค์์ ์ง๊ณ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ณํ ์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ๋ชฉ๋น ํ๊ท ์๋์ ์ฌ์ฉํ์ฌ ์ฃผ๋ฌธ ๋ฐ ์ด ์๋ ๊ณ์ฐํ๊ธฐ
๋ค์ ์์ ์์๋ ord_date
๊ฐ์ด 2020-03-01
์ด์์ธ ๋ชจ๋ ๋ฌธ์์ ๋ํ orders
์ปฌ๋ ์
์์์ ๋ํ ๋งต-๋ฆฌ๋์ค ์ฐ์ฐ์ ๋ณผ ์ ์์ต๋๋ค.
ํด๋น ์์ ์์์ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
item.sku
ํ๋๋ณ๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐsku
์ ๋ํด ์ฃผ๋ฌธ ์์ ์ด ์ฃผ๋ฌธ ์๋์ ๊ณ์ฐํฉ๋๋ค.๊ฐ
sku
๊ฐ์ ๋ํ ์ฃผ๋ฌธ๋น ํ๊ท ์๋์ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ ์ปฌ๋ ์ ์ ๋ณํฉํฉ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณํฉํ ๋ ๊ธฐ์กด ๋ฌธ์์ ์ ๊ฒฐ๊ณผ์ ๋์ผํ ํค๊ฐ ์์ผ๋ฉด ์์ ์ด ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์๋๋ค. ๋์ผํ ํค๋ฅผ ๊ฐ์ง ๊ธฐ์กด ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํด๋น ๋ฌธ์๊ฐ ์ฝ์ ๋ฉ๋๋ค.
์์ ๋จ๊ณ:
๊ฐ ์ ๋ ฅ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ๋งต ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ธ์.
์ด ํจ์์์
this
๋ ๋งต ๋ฆฌ๋์ค ์์ ์ด ์ฒ๋ฆฌํ๊ณ ์๋ ๋ฌธ์๋ฅผ ๋ํ๋ ๋๋ค.ํจ์๋ ๊ฐ ํญ๋ชฉ์ ๋ํด
sku
๋ฅผ ์๋ก์ดvalue
๊ฐ์ฒด์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๊ฐ์ฒด์๋count
๊ฐ1
๊ณผ ์ฃผ๋ฌธ์ ๋ํ ํญ๋ชฉqty
๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ,sku
(key
์ ์ ์ฅ๋จ)์value
๋ฅผ ๋ด๋ณด๋ ๋๋ค.
var mapFunction2 = function() { for (var idx = 0; idx < this.items.length; idx++) { var key = this.items[idx].sku; var value = { count: 1, qty: this.items[idx].qty }; emit(key, value); } }; ๋ ๊ฐ์ ์ธ์
keySKU
์countObjVals
์ ์ฌ์ฉํ์ฌ ์์ํ๋ ๋ฆฌ๋์ค ํจ์๋ฅผ ์ ์ํ์ธ์.countObjVals
๋งต ํจ์๊ฐ ๋ฆฌ๋์ ํจ์์ ์ ๋ฌํ ๊ทธ๋ฃนํ๋keySKU
๊ฐ์ ๋งคํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ ๋๋ค.์ด ํจ์๋
countObjVals
๋ฐฐ์ด์count
๋ฐqty
ํ๋๋ฅผ ํฌํจํ๋ ๋จ์ผ ๊ฐ์ฒดreducedValue
๋ก ์ค์ ๋๋ค.reducedVal
์์count
ํ๋๋ ๊ฐ๋ณ ๋ฐฐ์ด ์์์count
ํ๋ ํฉ๊ณ๋ฅผ ํฌํจํ๊ณqty
ํ๋๋ ๊ฐ๋ณ ๋ฐฐ์ด ์์์qty
ํ๋ ํฉ๊ณ๋ฅผ ํฌํจํฉ๋๋ค.
var reduceFunction2 = function(keySKU, countObjVals) { reducedVal = { count: 0, qty: 0 }; for (var idx = 0; idx < countObjVals.length; idx++) { reducedVal.count += countObjVals[idx].count; reducedVal.qty += countObjVals[idx].qty; } return reducedVal; }; ๋ ๊ฐ์ ์ธ์
key
์reducedVal
์ ์ฌ์ฉํ์ฌ ์ต์ข ํจ์๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํจ์๋reducedVal
๊ฐ์ฒด๋ฅผ ์์ ํ์ฌavg
๋ผ๋ ๊ณ์ฐ๋ ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.var finalizeFunction2 = function (key, reducedVal) { reducedVal.avg = reducedVal.qty/reducedVal.count; return reducedVal; }; mapFunction2
,reduceFunction2
๋ฐfinalizeFunction2
ํจ์๋ฅผ ์ฌ์ฉํ์ฌorders
์ปฌ๋ ์ ์ ๋ํด ๋งต-๋ฆฌ๋์ค ์์ ์ ์ํํ์ธ์.db.orders.mapReduce( mapFunction2, reduceFunction2, { out: { merge: "map_reduce_example2" }, query: { ord_date: { $gte: new Date("2020-03-01") } }, finalize: finalizeFunction2 } ); ์ด ์์ ์
query
ํ๋๋ฅผ ์ฌ์ฉํ์ฌord_date
๊ฐnew Date("2020-03-01")
์ด์์ธ ๋ฌธ์๋ง ์ ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ์ map_reduce_example2
์ ์ถ๋ ฅํฉ๋๋ค.map_reduce_example2
์ปฌ๋ ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์์ ์ ๊ธฐ์กด ์ฝํ ์ธ ๋ฅผ ์ด ๋งต-๋ฆฌ๋์ค ์ฐ์ฐ์ ๊ฒฐ๊ณผ์ ๋ณํฉํฉ๋๋ค. ์ฆ, ๊ธฐ์กด ๋ฌธ์์ ์ ๊ฒฐ๊ณผ์ ๋์ผํ ํค๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ฐ์ ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์๋๋ค. ๋์ผํ ํค๋ฅผ ๊ฐ์ง ๊ธฐ์กด ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์๊ฐ ์ฝ์ ๋ฉ๋๋ค.map_reduce_example2
์ปฌ๋ ์ ์ ์ฟผ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.db.map_reduce_example2.find().sort( { _id: 1 } ) ์ด ์์ ์ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } }
์ง๊ณ ๋์
์ฌ์ฉ ๊ฐ๋ฅํ ์ง๊ณ ํ์ดํ๋ผ์ธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ํจ์๋ฅผ ์ ์ํ์ง ์๊ณ ๋ ๋งต-๋ฆฌ๋์ค ์์ ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
db.orders.aggregate( [ { $match: { ord_date: { $gte: new Date("2020-03-01") } } }, { $unwind: "$items" }, { $group: { _id: "$items.sku", qty: { $sum: "$items.qty" }, orders_ids: { $addToSet: "$_id" } } }, { $project: { value: { count: { $size: "$orders_ids" }, qty: "$qty", avg: { $divide: [ "$qty", { $size: "$orders_ids" } ] } } } }, { $merge: { into: "agg_alternative_3", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } } ] )
$match
๋จ๊ณ์์๋ord_date
๊ฐnew Date("2020-03-01")
์ด์์ธ ๋ฌธ์๋ง ์ ํํฉ๋๋ค.$unwind
๋จ๊ณ์์๋items
๋ฐฐ์ด ํ๋๋ณ๋ก ๋ฌธ์๋ฅผ ์ธ๋ถํํ์ฌ ๊ฐ ๋ฐฐ์ด ์์์ ๋ํ ๋ฌธ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.{ "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "apples", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "oranges", "qty" : 8, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "pears", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 4, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-18T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 5, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-19T00:00:00Z"), "price" : 50, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } ... $group
๋จ๊ณ๋items.sku
๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ sku์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํฉ๋๋ค.qty
ํ๋.qty
ํ๋๋ ๋ค์์ ํฌํจํฉ๋๋ค.- ๊ฐ
items.sku
์ ๋ํ ์ดqty
($sum
์ฐธ์กฐ).
orders_ids
๋ฐฐ์ด.orders_ids
ํ๋๋ ๋ค์์ ํฌํจํฉ๋๋ค.items.sku
์ ๋ํ ๊ณ ์ ์ฃผ๋ฌธ_id
๋ฐฐ์ด ($addToSet
์ฐธ์กฐ).
{ "_id" : "chocolates", "qty" : 15, "orders_ids" : [ 2, 5, 8 ] } { "_id" : "oranges", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ] } { "_id" : "carrots", "qty" : 15, "orders_ids" : [ 6, 9 ] } { "_id" : "apples", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ] } { "_id" : "pears", "qty" : 10, "orders_ids" : [ 3 ] } $project
๋จ๊ณ์์๋ ๋งต ๋ฆฌ๋์ค์ ์ถ๋ ฅ์ ๋ฏธ๋ฌ๋งํ์ฌ_id
์value
๋ ํ๋๋ฅผ ๊ฐ๋๋ก ์ถ๋ ฅ ๋ฌธ์๋ฅผ ์ฌ๊ตฌ์ฑํฉ๋๋ค.$project
๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.$unwind
๋จ๊ณ์์๋items
๋ฐฐ์ด ํ๋๋ณ๋ก ๋ฌธ์๋ฅผ ์ธ๋ถํํ์ฌ ๊ฐ ๋ฐฐ์ด ์์์ ๋ํ ๋ฌธ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.{ "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "apples", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "oranges", "qty" : 8, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "pears", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 4, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-18T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 5, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-19T00:00:00Z"), "price" : 50, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } ... $group
๋จ๊ณ๋items.sku
๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ sku์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํฉ๋๋ค.qty
ํ๋.qty
ํ๋์๋$sum
์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ ๊ฐitems.sku
๋ณ ์ฃผ๋ฌธ๋ ์ดqty
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.orders_ids
๋ฐฐ์ด.orders_ids
ํ๋๋$addToSet
์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋items.sku
์ ๊ณ ์ ํ ์ฃผ๋ฌธ_id
๋ฐฐ์ด์ ํฌํจํ๊ณ ์์ต๋๋ค.
{ "_id" : "chocolates", "qty" : 15, "orders_ids" : [ 2, 5, 8 ] } { "_id" : "oranges", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ] } { "_id" : "carrots", "qty" : 15, "orders_ids" : [ 6, 9 ] } { "_id" : "apples", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ] } { "_id" : "pears", "qty" : 10, "orders_ids" : [ 3 ] } $project
๋จ๊ณ์์๋ ๋งต ๋ฆฌ๋์ค์ ์ถ๋ ฅ์ ๋ฏธ๋ฌ๋งํ์ฌ_id
์value
๋ ํ๋๋ฅผ ๊ฐ๋๋ก ์ถ๋ ฅ ๋ฌธ์๋ฅผ ์ฌ๊ตฌ์ฑํฉ๋๋ค.$project
๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.$size
๋ฅผ ์ฌ์ฉํ์ฌvalue.count
๋ฅผorders_ids
๋ฐฐ์ด์ ํฌ๊ธฐ๋ก ์ค์ ํฉ๋๋ค.value.qty
๋ฅผ ์ ๋ ฅ ๋ฌธ์์qty
ํ๋๋ก ์ค์ ํฉ๋๋ค.$divide
์$size
๋ฅผ ์ฌ์ฉํ์ฌvalue.avg
๋ฅผ ์ฃผ๋ฌธ๋น ํ๊ท ์ฃผ๋ฌธ ์๋์ผ๋ก ์ค์ ํฉ๋๋ค.
{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } } ๋ง์ง๋ง์ผ๋ก
$merge
๋ ์ถ๋ ฅ์ ์ปฌ๋ ์ agg_alternative_3
์ ์๋๋ค. ๊ธฐ์กด ๋ฌธ์์ ์ ๊ฒฐ๊ณผ์ ๋์ผํ ํค_id
๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์๋๋ค. ๋์ผํ ํค๋ฅผ ๊ฐ์ง ๊ธฐ์กด ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ด ๋ฌธ์๋ฅผ ์ฝ์ ํฉ๋๋ค.agg_alternative_3
์ปฌ๋ ์ ์ ์ฟผ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.db.agg_alternative_3.find().sort( { _id: 1 } ) ์ด ์์ ์ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } }
ํ
๋ค์๋ ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ์ ์ ์ ์ง๊ณ ํํ์์ ์ฌ์ฉํ๋ ๋์์ ๋งต-๋ฆฌ๋์ค์์ ์ง๊ณ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ณํ ์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ถ๋ ฅ
db.collection.mapReduce()
๋ฉ์๋์ ์ถ๋ ฅ์ mapReduce
๋ช
๋ น์ ์ถ๋ ฅ๊ณผ ๋์ผํฉ๋๋ค. ์ถ๋ ฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ mapReduce
๋ช
๋ น์ ์ถ๋ ฅ db.collection.mapReduce()
์น์
์ ์ฐธ์กฐํ์ธ์.
์ ํ ์ฌํญ
db.collection.mapReduce()
๋ ๋ ์ด์ afterClusterTime์ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ db.collection.mapReduce()
๋ ์ธ๊ณผ์ ์ผ๋ก ์ผ๊ด๋ ์ธ์
๊ณผ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.