๋ฐ์ดํฐ ์ ๋ ฌ.
์ด ํ์ด์ง์ ๋ด์ฉ
๋ฐ์ดํฐ ์ ๋ ฌ์ MongoDB 3.4 ์ด์์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์
๋ณธ ๊ฐ์ด๋์์๋ ์ ๋ ฌ ๊ท์น ์งํฉ์ธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ํน์ ์ธ์ด ๋ฐ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ (๊ณตํต ์ธ์ด ๊ด์ฉ๊ตฌ๋ฅผ ๊ณต์ ํ๋ ์ปค๋ฎค๋ํฐ ๋๋ ์ง์ญ)์ ๋ํด ๋ฌธ์์ด ์์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
MongoDB๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ ์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ ๋ ฌํฉ๋๋ค. ์ด ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฉ์๋๋ ASCII ํ์ค ์ ์ฌ์ฉํฉ๋๋ค. ๋ฌธ์์ด์ ๋น๊ตํ๊ณ ์ ๋ ฌํ๋ ๋ฌธ์ ๊ฐ. ์ธ์ด ๋ฐ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์๋ ASCII ํ์ค๊ณผ ๋ค๋ฅธ ํน์ ๋ฌธ์ ์์ ๊ท์น์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์บ๋๋ค ํ๋์ค์ด์์๋ ๊ธฐํ ๋ฌธ์๊ฐ ๋์ผํ ๊ฒฝ์ฐ ๋งจ ์ฐ์ธก ์ ์ผํธ ๋ฌธ์์ ๋ฐ๋ผ ๋ฌธ์์ด ์์๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํ๋์ค์ด ๋จ์ด๋ฅผ ์๊ฐํด ๋ด ๋๋ค, ์ฆ ์ฝํธ, ์ฝํ , ์ฝํธ, ์ฝํ .
MongoDB๋ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ๋ ฌํฉ๋๋ค.
cote cotรฉ cรดte cรดtรฉ
MongoDB๋ ์บ๋๋ค ํ๋์ค์ด ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ๋ ฌํฉ๋๋ค.
cote cรดte cotรฉ cรดtรฉ
์ฌ์ฉ๋ฒ
์ ์ปฌ๋ ์ ์ด๋ ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ต๋๋ค. CRUD ์์ ๋ฐ ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ์ ๋ํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์๋ ์์ต๋๋ค.
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ ์ปฌ๋ ์ ์ ์์ฑํ๋ ๊ฒฝ์ฐ ํด๋น ์ปฌ๋ ์ ์์ ํธ์ถ๋๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ๋ ๋ชจ๋ ์์ ์ ๋ํ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ ์ํ ์ ์์ต๋๋ค. ๋ค์ํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ์ฌ ์์ ์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
ํ์ฌ๋ ๊ธฐ์กด ์ปฌ๋ ์ ์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์์ฑํ ์ ์์ต๋๋ค. ๊ธฐ์กด ์ปฌ๋ ์ ์์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์๋ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ํด๋น ์ธ๋ฑ์ค์ ๋ํ ์์ ์์ ๋์ผํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค.
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ๋ํ ์ ๋ ฌ ์์๋ฅผ ์ง์ ํฉ๋๋ค. ์ธ๋ฑ์ค์์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ค๋ฉด ์์ ์ ์ผ์นํ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ ๊ณตํ๊ณ ์์ ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ธ๋ฑ์ค ์ ํ์ ๋๋ถ๋ถ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ ํ์ ๋ฐ์ด๋๋ฆฌ ๋น๊ต๋ง ์ง์ํฉ๋๋ค.
๋ฐ์ดํฐ ์ ๋ ฌ ๋งค๊ฐ๋ณ์
๋ฐ์ดํฐ ์ ๋ ฌ ๊ฐ์ฒด์๋ ๋ค์๊ณผ ๊ฐ์ ๋งค๊ฐ ๋ณ์ ๋ฑ์ด ์์ต๋๋ค.
collation: { locale: <string>, caseLevel: <bool>, caseFirst: <string>, strength: <int>, numericOrdering: <bool>, alternate: <string>, maxVariable: <string>, backwards: <bool> }
๋ฐ์ดํฐ ์ ๋ ฌ์์ locale
ํ๋๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ํ๋๋ ์ ํ ์ฌํญ์
๋๋ค. ์ง์๋๋ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ ์ ์ฒด ๋ชฉ๋ก๊ณผ locale
ํ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ง์๋๋ ์ธ์ด ๋ฐ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ ์ฐธ์กฐํ์ธ์. ๊ฐ ํ๋์ ๋ํ ์ค๋ช
์ ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฌธ์ MongoDB ์๋ ํญ๋ชฉ์ ์ฐธ์กฐํ์ธ์.
๋ฐ์ดํฐ ์ ๋ ฌ ์์
์ปฌ๋ ์ ์ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ค์ ํ๋ค
๋ค์ ์์์์๋ souvenirs
๋ผ๋ ์ ์ปฌ๋ ์
์ ๋ง๋ค๊ณ "fr_CA"
๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ํ ๋นํฉ๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ์ ํด๋น ์ปฌ๋ ์
์์ ์ํ๋๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ๋ ์์
์ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค.
db.createCollection("souvenirs", { collation: { locale: "fr_CA" }, });
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ๋ ์์
์ ๋ชจ๋ ์ปฌ๋ ์
์์ ์ ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์๋์ผ๋ก ์ ์ฉํฉ๋๋ค. ๋ค์ ์ฟผ๋ฆฌ๋ souvenirs
์ปฌ๋ ์
์ ๊ฒ์ํ๊ณ "fr_CA"
๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ ์ฉํฉ๋๋ค.
myColl.find({type: "photograph"});
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ๋ ์์
์์ ๋ค์ํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ๋ค์ ์ฟผ๋ฆฌ๋ "upper"
๊ฐ์ ์ฌ์ฉํ์ฌ "is"
์์ด์ฌ๋๋ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ๊ณผ caseFirst
์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค.
myColl.find({type: "photograph"}, { collation: { locale: "is", caseFirst: "upper" } } );
์ธ๋ฑ์ค์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ํ ๋นํ๋ค
๋ค์ ์์์์๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ด '"en_US"
' ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ผ๋ก ์ค์ ๋ ์ปฌ๋ ์
์ title
ํ๋์ ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๋ค.
myColl.createIndex( { 'title' : 1 }, { 'collation' : { 'locale' : 'en_US' } });
๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ ์ ํฌ๊ฐ ์์ฑํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US" }}) .sort({"title": -1});
๋ค์๊ณผ ์ฟผ๋ฆฌ๋ ์ ํฌ๊ฐ ์์ฑํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์๊ณ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ ์ ๋ ฌ๊ณผ ๋ค๋ฅธ ๊ฐ๋ ๊ฐ ๋ฑ์ด ์์ต๋๋ค.
myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US", "strength": 2 }}) .sort({"title": -1});
myColl.find({"year": 1980}) .sort({"title": -1});
๋ฐ์ดํฐ ์ ๋ ฌ ์ฟผ๋ฆฌ ์์
์ปฌ๋ ์ ์์ ๋ฌธ์๋ฅผ ์ฝ๊ณ , ์ ๋ฐ์ดํธํ๊ณ , ์ญ์ ํ๋ ์์ ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์น์ ์๋ ์ด๋ฌํ ์ ํ์ ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ํ๋ ์ ์ฒด ์์ ๋ชฉ๋ก์ MongoDB ๋งค๋ด์ผ์ ์ฐธ์กฐํ์ธ์.
find() ๋ฐ sort() ์์
๋ค์ ์์์์๋ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ์ปฌ๋ ์
์์ find()
๋ฐ sort()
๋ชจ๋๋ฅผ ํธ์ถํฉ๋๋ค. locale
๋งค๊ฐ๋ณ์์ ๊ฐ์ "de"
๋ก(์ผ๋ก) ์ค์ ํ์ฌ ๋
์ผ์ด ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํฉ๋๋ค.
myColl.find({ city: "New York" }, { collation: { locale: "de" } }) .sort({ name: 1 });
findOneAndUpdate() ์์
๋ค์ ์์์์๋ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ์ปฌ๋ ์
์์ findOneAndUpdate()
์์
์ ํธ์ถํฉ๋๋ค. ์ปฌ๋ ์
์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฑ์ด ์์ต๋๋ค.
{ "_id" : 1, "first_name" : "Hans" } { "_id" : 2, "first_name" : "Gunter" } { "_id" : 3, "first_name" : "Gรผnter" } { "_id" : 4, "first_name" : "Jรผrgen" }
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ์ง ์๋ ์ด ์ปฌ๋ ์
์์ ๋ค์ findOneAndUpdate()
์์
์ ๊ฐ์ํฉ๋๋ค.
myColl.findOneAndUpdate( { first_name : { $lt: "Gunter" } }, { $set: { verified: true } } );
" Gunter " ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋จผ์ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ๋ฌธ์์ $lt
๋น๊ต ์ฐ์ฐ์ ์์ ์ดํ์ ์ผ๋ก ์ผ์นํ๋ ๋ฌธ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์์
์ ์ด๋ค ๋ฌธ์๋ ์
๋ฐ์ดํธํ์ง ์์ต๋๋ค.
๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ด de@collation=phonebook
์ผ๋ก ์ค์ ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฐ์ฐ์ ๊ฐ์ํฉ๋๋ค. ์ด์ ๊ฐ์ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ํ์ํ๋ ๊ณ ์ ๋ช
์ฌ์ ์ฐ์ ์์ ์ง์ ๊ท์น ๋ฑ์ด ์๋ collation=phonebook
์ต์
์ ์ง์ ํฉ๋๋ค. de@collation=phonebook
๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ๋ฐ ์ต์
์ ์๋ผ์ฐํธ๊ฐ ์๋ ๋ฌธ์๋ฅผ ์๋ผ์ฐํธ๊ฐ ์๋ ๋์ผํ ๋ฌธ์๋ณด๋ค ๋จผ์ ์ ๋ ฌํฉ๋๋ค.
myColl.findOneAndUpdate( { first_name: { $lt: "Gunter" } }, { $set: { verified: true } }, { collation: { locale: "de@collation=phonebook" } }, );
de@collation=phonebook
์ ์ง์ ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ "Gรผnter" ์ดํ์ ์ผ๋ก "Gunter" ์์ findOneAndUpdate()
์ค๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์
์ ๋ค์๊ณผ ๊ฐ์ ์
๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ lastErrorObject: { updatedExisting: true, n: 1 }, value: { _id: 3, first_name: 'Gรผnter' }, ok: 1 }
findOneAndDelete() ์์
๋ค์ ์์์์๋ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์๊ฐ ์๋ ์ปฌ๋ ์
์์ findOneAndDelete()
์์
์ ํธ์ถํฉ๋๋ค.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
์ด๋ฌํ ์์์๋ ์ดํ ์์๊ฐ ์๋, ์ซ์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ซ์ ๋ฌธ์์ด์ ์ ๋ ฌํ๊ธฐ ์ํด numericOrdering
๋ฐ์ดํฐ ์ ๋ ฌ ๋งค๊ฐ๋ณ์๋ฅผ true
๋ก ์ค์ ํ์ต๋๋ค.
myColl.findOneAndDelete( { a: { $gt: "100" } }, { collation: { locale: "en", numericOrdering: true } }, );
์๋จ์ ์์ ์ ์คํํ ํ ์ปฌ๋ ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์๊ฐ ํฌํจ๋ฉ๋๋ค.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
์ธ ๋ฌธ์์ ์๋ณธ ์ปฌ๋ ์
์ ๋ํด ๋ฐ์ดํฐ ์ ๋ ฌ ์์ด ๋์ผํ ์์
์ ์ํํ๋ฉด ๋ฌธ์์ด("16"
, "84"
, "179"
)์ ์ดํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์๋ฅผ ์ผ์น์ํค๊ณ , ์ฟผ๋ฆฌ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์ญ์ ํฉ๋๋ค.
await myColl.findOneAndDelete({ a: { $gt: "100" } });
๋ชจ๋ ๋ฌธ์์ a
ํ๋์ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ์ดํ ๊ฐ( "100"
์ ์ดํ ๊ฐ๋ณด๋ค ํผ)์ด ์๊ธฐ ๋๋ฌธ์, ์์
์ ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์์ ์์
์ ์คํํ๊ณ ๋๋ฉด ์ปฌ๋ ์
์๋ ๋ค์ ๋ฌธ์๊ฐ ํฌํจ๋ฉ๋๋ค.
{ "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
์ ๊ทธ๋ฆฌ๊ฒ์ด์ ์์
์ง๊ณ ์ ํจ๊ป ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค. ์์ ์์๋ ํ์ดํ๋ผ์ธ ๋จ๊ณ ๋ฐฐ์ด ๋ค์ ์ต์ ํ๋์ ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฌธ์๋ฅผ ์ ๋ฌํฉ๋๋ค.
๋ค์ ์์์๋ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ์ปฌ๋ ์
์ ์ง๊ณ ํ์ดํ๋ผ์ธ์ ๋ณด์ฌ์ค๋๋ค. ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ์ด ์ ๊ทธ๋ฆฌ๊ฒ์ด์
๋ first_name
ํ๋๋ฅผ ๋ถ๋ฅํ๊ณ ๊ฐ ๊ทธ๋ฃน์ ์ด ๊ฒฐ๊ณผ ์๋ฅผ ๊ณ์ฐํ ๋ค์ ๋
์ผ ์ ํ ๋ฒํธ๋ถ("de@collation=phonebook"
๊ตญ๊ฐ ๋ฐ ์ธ์ด ์ค์ ) ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํฉ๋๋ค.
์ฐธ๊ณ
์ ๊ทธ๋ฆฌ๊ฒ์ด์ ์์ ๋ฐ์ดํฐ ์ ๋ ฌ ํ๋๋ง ์ง์ ํ ์ ์์ต๋๋ค.
myColl.aggregate( [ { $group: { "_id": "$first_name", "nameCount": { "$sum": 1 } } }, { $sort: { "_id": 1 } }, ], { collation: { locale: "de@collation=phonebook" } }, );