๋ฉํฐํค ์ธ๋ฑ์ค
์ด ํ์ด์ง์ ๋ด์ฉ
๋ฐฐ์ด์ ํฌํจ๋ ํ๋์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ฉํฐํค ์ธ๋ฑ์ค๋ ๋ฐฐ์ด ํ๋์ ๋ํ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๋ฉํฐํค ์ ํ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐฐ์ด ๊ฐ์ด ํฌํจ๋ ํ๋์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด MongoDB๋ ์๋์ผ๋ก ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ฉํฐํค ์ธ๋ฑ์ค๋ก ์ค์ ํฉ๋๋ค.
MongoDB๋ ์ค์นผ๋ผ ๊ฐ(์: ๋ฌธ์์ด ๋ฐ ์ซ์)๊ณผ ๋ด์ฅ๋ ๋ฌธ์๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ํด ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฐฐ์ด์ ๋์ผํ ๊ฐ์ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค์๋ ํด๋น ๊ฐ์ ๋ํ ํญ๋ชฉ์ด ํ๋๋ง ํฌํจ๋ฉ๋๋ค.
๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ํ๋กํ ํ์ ์ ์ฌ์ฉํฉ๋๋ค:
db.<collection>.createIndex( { <arrayField>: <sortOrder> } )
์ด ์ด๋ฏธ์ง๋ addr.zip
ํ๋์ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
MongoDB Atlas์์ ํธ์คํ ๋๋ ๋ฐฐํฌ์๋ฒ๋ฅผ ์ํด UI์์ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐ์ด ๊ฐ์ด ํฌํจ๋ ํ๋๋ฅผ ์์ฃผ ์ฟผ๋ฆฌํ๋ ๊ฒฝ์ฐ ๋ฉํฐํค ์ธ๋ฑ์ค๋ ํด๋น ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ๋๋ ํ๋๋ฅผ ์ธ๋ฑ์ฑํ๋ฉด ์ด (๊ฐ) ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ํฌํจ๋ ์ฟผ๋ฆฌ๋ ๋ฌธ์๋ฅผ ๊ฒ์ฌํ์ง ์๊ณ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ถฉ์กฑํ ์ ์๋ ์ฟผ๋ฆฌ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ์ต์ ํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด students
์ปฌ๋ ์
์ ๋ฌธ์์๋ ํ์์ด ํ๊ธฐ ๋ด๋ด ๋ฐ์ ์ํ ์ ์์ ๋ฐฐ์ด์ธ test_scores
ํ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. test_scores
๊ฐ 90
์ด์์ธ ํ์์ด 5๊ฐ ์ด์์ธ ์์ ํ์ ๋ชฉ๋ก์ ์ ๊ธฐ์ ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด test_scores
ํ๋์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. test_scores
์ ๋ฐฐ์ด ๊ฐ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก MongoDB๋ ์ธ๋ฑ์ค๋ฅผ ๋ฉํฐํค ์ธ๋ฑ์ค๋ก ์ ์ฅํฉ๋๋ค.
์์ํ๊ธฐ
๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์์ ์ฐธ์กฐํ์ธ์.
์ธ๋ถ ์ ๋ณด
์ด ์น์ ์์๋ ๋ฉํฐํค ์ธ๋ฑ์ค์ ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ๊ณผ ์ ํ ์ฌํญ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
์ธ๋ฑ์ค ๋ฐ์ด๋
์ธ๋ฑ์ค ์ค์บ์ ๋ฐ์ด๋๋ ์ฟผ๋ฆฌ ์ค์ ๊ฒ์ํ ์ธ๋ฑ์ค ๋ถ๋ถ์ ์ ์ํฉ๋๋ค. ๋ฉํฐํค ์ธ๋ฑ์ค ๋ฐ์ด๋ ๊ณ์ฐ์ ํน๋ณํ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฉํฐํค ์ธ๋ฑ์ค ๋ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ณ ์ ํ ๋ฉํฐํค ์ธ๋ฑ์ค
๊ณ ์ ํ ๋ฉํฐํค ์ธ๋ฑ์ค์์ ๋ฌธ์์๋ ํด๋น ๋ฌธ์์ ์ธ๋ฑ์ค ํค ๊ฐ์ด ๋ค๋ฅธ ๋ฌธ์์ ์ธ๋ฑ์ค ํค ๊ฐ๊ณผ ์ค๋ณต๋์ง ์๋ ํ ๋ฐ๋ณต๋๋ ์ธ๋ฑ์ค ํค ๊ฐ์ ์ด๋ํ๋ ๋ฐฐ์ด ์์๊ฐ ์์ ์ ์์ต๋๋ค.
์ด ๋์์ ๋ํด ์์ธํ ์์๋ณด๊ณ ์์ ๋ฅผ ๋ณด๋ ค๋ฉด ๋ณ๋์ ๋ฌธ์๋ก ๊ณ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ฐธ์กฐํ์ธ์.
๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค
๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค์์ ์ธ๋ฑ์ฑ๋ ๊ฐ ๋ฌธ์์๋ ๊ฐ์ด ๋ฐฐ์ด์ธ ์ธ๋ฑ์ฑ๋ ํ๋๊ฐ ํ๋๋ง ์์ ์ ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธ๋ฑ์ค ์ฌ์์์ ๋ ์ด์์ ํ๋๊ฐ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋ฌธ์๊ฐ ํฌํจ๋ ์ปฌ๋ ์ ์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
{ _id: 1, scores_spring: [ 8, 6 ], scores_fall: [ 5, 9 ] } ์ธ๋ฑ์ค์ ๋ ํ๋๊ฐ ๋ชจ๋ ๋ฐฐ์ด์ด๋ฏ๋ก ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค
{ scores_spring: 1, scores_fall: 1 }
์ ์์ฑํ ์ ์์ต๋๋ค.๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด ์ ํ ์ฌํญ์ ์๋ฐํ๋ ๋ฌธ์๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์๊ฐ ํฌํจ๋ ์ปฌ๋ ์ ์ ์๊ฐํด ๋ณด์ธ์:
{ _id: 1, scores_spring: [8, 6], scores_fall: 9 } { _id: 2, scores_spring: 6, scores_fall: [5, 7] } ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค
{ scores_spring: 1, scores_fall: 1 }
์ ๋ง๋ค ์ ์๋ ์ด์ ๋ ๊ฐ ๋ฌธ์์ ๋ํด ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค๋ก ์ธ๋ฑ์ฑ๋๋ ํ๋๊ฐ ๋ฐฐ์ด ํ๋๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌธ์์scores_spring
๋ฐscores_fall
ํ๋ ๋ชจ๋์ ๋ํ ๋ฐฐ์ด ๊ฐ์ด ํฌํจ๋์ด ์์ง ์์ต๋๋ค.๊ทธ๋ฌ๋ ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ํ์๋
scores_spring
๋ฐscores_fall
ํ๋๊ฐ ๋ชจ๋ ๋ฐฐ์ด์ธ ๋ฌธ์๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ๋ฉด ์ฝ์ ์ด ์คํจํฉ๋๋ค.
์ ๋ ฌ
๋ฉํฐํค ์ธ๋ฑ์ค ๋ก ์ธ๋ฑ์ฑ๋ ๋ฐฐ์ด ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ ๊ฐ์ง ๋ชจ๋์ ํด๋นํ์ง ์๋ ํ ์ฟผ๋ฆฌ ๊ณํ์ ๋ธ๋กํน ์ ๋ ฌ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ชจ๋ ์ ๋ ฌ ํ๋์ ์ธ๋ฑ์ค ๊ฒฝ๊ณ๋
[MinKey, MaxKey]
์ ๋๋ค.๋ฉํฐํค ์ธ๋ฑ์ค ํ๋์ ๊ฒฝ๊ณ์๋ ์ ๋ ฌ ํจํด๊ณผ ๋์ผํ ๊ฒฝ๋ก ์ ๋์ฌ๊ฐ ์์ต๋๋ค.
์ค๋ ํค
๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์ค๋ ํค ์ธ๋ฑ์ค๋ก ์ง์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค๋ ํค ์ธ๋ฑ์ค๊ฐ ๋ณตํฉ ์ธ๋ฑ์ค์ ์ ๋์ฌ(prefix)์ด๊ณ (์ค๋ ํค์ ์ผ๋ถ๊ฐ ์๋) ํํ ํค ์ค ํ๋๊ฐ ๋ฐฐ์ด์ ์ธ๋ฑ์ฑํ๋ ๊ฒฝ์ฐ ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ๋ณตํฉ ๋ฉํฐํค ์ธ๋ฑ์ค๊ฐ ๋ ์ ์์ต๋๋ค.
ํด์ ์ธ๋ฑ์ค
ํด์ ์ธ๋ฑ์ค๋ ๋ฉํฐํค์ผ ์ ์์ต๋๋ค.
์ง์๋๋ ์ฟผ๋ฆฌ
๋ฉํฐํค ์ธ๋ฑ์ค๋ ๋ฐฐ์ด ํ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ํฌ๊ดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ฑ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ฉํฐํค๋ก ๋ง๋๋ ์์ธ์ด ๋๋ ํ๋๋ฅผ ์ถ์ ํ๋ ๊ฒฝ์ฐ ๋ฉํฐํค ์ธ๋ฑ์ค๋ ๋ฐฐ์ด์ด ์๋ ํ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฌํ ๋ฌธ์๊ฐ ํฌํจ๋matches
์ปฌ๋ ์
์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค:
db.matches.insertMany( [ { name: "joe", event: ["open", "tournament"] }, { name: "bill", event: ["match", "championship"] } ] )
matches
์ปฌ๋ ์
์ name
๋ฐ event
ํ๋์ ๋ณตํฉ ๋ค์ค ํค ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค:
db.matches.createIndex( { name: 1, event: 1 } )
event
ํ๋์ ๋ฐฐ์ด ๊ฐ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ด ์ธ๋ฑ์ค๋ ๋ฉํฐํค ์ธ๋ฑ์ค์
๋๋ค.
์ผ์นํ๋ ํ๋(name
)๊ฐ ๋ฐฐ์ด์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฉํฐํค ์ธ๋ฑ์ค๋ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค.
db.matches.find( { name: "bill" } )
name
ํ๋๊ฐ ์ธ๋ฑ์ค ์ ๋์ฌ์ ์ผ๋ถ์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ name
ํ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฉํฐํค ์ธ๋ฑ์ค๋ ๋ฐฐ์ด ํ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ name
๋ฐ event
๋ชจ๋์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฐฐ์ด ํ๋ ์ ์ฒด์ ๋ํ ์ฟผ๋ฆฌ
์ฟผ๋ฆฌ ํํฐ๊ฐ ๋ฐฐ์ด ์ ์ฒด์ ๋ํด ์ ํํ ์ผ์นํ๋ ํญ๋ชฉ์ ์ง์ ํ๋ ๊ฒฝ์ฐ, MongoDB๋ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์กฐํํ ์ ์์ง๋ง ๋ฉํฐํค ์ธ๋ฑ์ค ์ค์บ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐฐ์ด์ ์ฐพ์ ์๋ ์์ต๋๋ค.
๋์ , ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์กฐํํ ํ MongoDB๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ณ ๋ฐฐ์ด์ด ์ฟผ๋ฆฌ์ ๋ฐฐ์ด๊ณผ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ํํฐ๋งํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฌํ ๋ฌธ์๊ฐ ํฌํจ๋ inventory
์ปฌ๋ ์
์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
db.inventory.insertMany( [ { _id: 5, type: "food", item: "apple", ratings: [ 5, 8, 9 ] } { _id: 6, type: "food", item: "banana", ratings: [ 5, 9 ] } { _id: 7, type: "food", item: "chocolate", ratings: [ 9, 5, 8 ] } { _id: 8, type: "food", item: "fish", ratings: [ 9, 5 ] } { _id: 9, type: "food", item: "grapes", ratings: [ 5, 9, 5 ] } ] )
inventory
์ปฌ๋ ์
์๋ ratings
ํ๋์ ๋ฉํฐํค ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.
db.inventory.createIndex( { ratings: 1 } )
๋ค์ ์ฟผ๋ฆฌ๋ ratings
ํ๋๊ฐ [ 5, 9 ]
๋ฐฐ์ด์ธ ๋ฌธ์๋ฅผ ์ฐพ์ต๋๋ค.
db.inventory.find( { ratings: [ 5, 9 ] } )
MongoDB๋ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ratings
๋ฐฐ์ด์ ์์ ์์น์ 5
๊ฐ ์๋ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ MongoDB๋ ์ด๋ฌํ ๋ฌธ์๋ฅผ ์กฐํํ๊ณ ratings
๋ฐฐ์ด์ด ์ฟผ๋ฆฌ ๋ฐฐ์ด [ 5, 9 ]
์ ๋์ผํ ๋ฌธ์๋ฅผ ํํฐ๋งํฉ๋๋ค.
$expr
$expr
์ฐ์ฐ์๋ ๋ฉํฐํค ์ธ๋ฑ์ค๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์์ธํ ์์๋ณด๊ธฐ
MongoDB๊ฐ ๋ฉํฐํค ์ธ๋ฑ์ค ๋ฐ์ด๋๋ฅผ ๊ฒฐํฉํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ๋ฉํฐํค ์ธ๋ฑ์ค ๋ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฐฐ์ด ํ๋๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ๋ค์์ ์ฐธ์กฐํ์ธ์: