Skip to content

Latest commit

ย 

History

History
86 lines (61 loc) ยท 5.51 KB

File metadata and controls

86 lines (61 loc) ยท 5.51 KB

ํ”„๋กœ์ ํŠธ ๊ตฌ๋™ == MognoDB ๊ตฌ๋™

MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ”„๋กœ์ ํŠธ ์„ค์น˜ ์‹œ ์ด๋ฏธ ํ•จ๊ป˜ ์„ค์น˜ ๋˜์–ด์žˆ์œผ๋ฉฐ, meteor ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋™์‹œ์— MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญ์‹œ ํ•จ๊ป˜ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ๋™ ์‹œ ํฌํŠธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 3000๋ฒˆ์˜ ํฌํŠธ๋ฅผ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ๋‚ด์žฅ MongoDB๋Š” ์—ฌ๊ธฐ์— 1์„ ๋”ํ•œ 3001๋ฒˆ์—์„œ ํ•จ๊ป˜ ๊ตฌ๋™ ๋ฉ๋‹ˆ๋‹ค.

[๊ธฐ๋ณธ API] MongoDB API ์ฐธ์กฐ

  • Anywhere: new Meteor.Collection(name, [options]) # options: connection, idGeneration, transform
  • Anywhere: collection.findAll(selector, [options]) # options: sort, skip, limit, fields, reactive, transform
  • Anywhere: collection.findOne(selector, [options]) # options: sort, skip, fields, reactive, transform
  • Anywhere: collection.insert(doc, [callback])
  • Anywhere: collection.update(selector, modifier, [options], [callback]) # options: multi, upsert
  • Anywhere: collection.remove(selector, [callback])

๋ฐ์ดํ„ฐ ์ฝœ๋ ‰์…˜ ์ƒ์„ฑ

MongoDB์—์„œ๋Š” MySQL๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ RDBMS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ…Œ์ด๋ธ”์ด๋ผ ๋ถ€๋ฅด๋Š” ๋ฐ์ดํ„ฐ ์…‹์„ ์ฝœ๋ ‰์…˜(Collection)์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ ์ด๋Ÿฌํ•œ ์ฝœ๋ ‰์…˜์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ database.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Posts = new Mongo.Collection('posts')

์ƒ๊ธฐ ์ฝ”๋“œ๋Š” 'posts'๋ผ๋Š” ์ด๋ฆ„์˜ ์ฝœ๋ ‰์…˜์„ ์ƒ์„ฑ ํ•œ ํ›„, ์ด๋ฅผ Posts ๋ผ๋Š” ์ „์—ญ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ์ „์ฒด ํ”„๋กœ์ ํŠธ ์–ด๋””์—์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ด์ œ Posts ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ํ˜น์€ ์„œ๋ฒ„์˜ js ํŒŒ์ผ ์ค‘ ์–ด๋””์—์„œ๋‚˜ DB์˜ Posts ์ฝœ๋ ˆ์…˜์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ํ…Œ์ŠคํŠธ Posts ์ฝœ๋ ‰์…˜์„ ์ƒ์„ฑ ํ–ˆ๋‹ค๋ฉด, ์•„๋ž˜ ์ฝ”๋“œ๋“ค์„ server/main.js์˜ startup() ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Meteor.startup(function() { // code to run on server at startup // ์•„๋ž˜ ์ฝ”๋“œ๋“ค์„ ์ด ๋ถ€๋ถ„์— ์ž…๋ ฅํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. });

Insert

์ž์‹ ์ด ์ƒ์„ฑํ•œ MongoDB ์ฝœ๋ ‰์…˜ ๋ณ€์ˆ˜์— insert() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ํ˜•ํƒœ์˜ JSON๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

var post_id = Posts.insert({ 
  createdAt: new Date(),   //์ƒ์„ฑ๋‚ ์งœ ๋“ฑ ์›ํ•˜๋Š” ๊ตฌ์กฐ์˜ JSON ๋ฐ์ดํ„ฐ
  title: ...                      
  ...
});

์œ„์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ์‹œ, ๋žœ๋คํ•œ ๊ฐ’์˜ UUID ๋ฐ์ดํ„ฐ๊ฐ€ _id๋ผ๋Š” ๊ฐ’์œผ๋กœ JSON ๋ฐ์ดํ„ฐ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์–ด ์ €์žฅ ๋˜๋ฉฐ, ์ด๋Š” insert() ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ „๋‹ฌ ๋˜์–ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์œ ์ผํ•œ Key๋กœ ํ–ฅํ›„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํ™œ์šฉ ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

Find

๋ฐ์ดํ„ฐ๋ฅผ ์ฝœ๋ ‰์…˜์— ์ €์žฅํ•˜๊ณ ๋‚˜๋ฉด ์–ธ์ œ๋“  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

{   // ์ด๋Ÿฌํ•œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์ˆ˜๊ฐ€ ์ €์žฅ ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •.
  createdAt: new Date(),
  title: 'Hello World',
  message: 'Welcome to my world!'
  writer: 'John Doe'
}

FindOne()

Posts.findOne({writer: 'John Doe'}); 

์ƒ๊ธฐ ์ฝ”๋“œ๋Š” ์ด๋ฆ„์ด 'John Doe'์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒด ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— writer ํ•ญ๋ชฉ์ด 'John Doe'๋กœ ๋˜์–ด ์žˆ๋Š” ์ „์ฒด ๋ฌธ์„œ์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด์ด์ง€๋งŒ, findOne()์€ 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋จผ์ € ๊ฒ€์ƒ‰ ๋œ JSON ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„์—์„œ ๋ณด์•˜๋˜ insert() ์˜ˆ์ œ์™€ ๊ฐ™์ด post_id ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Posts.findOne({_id: post_id});

FindAll()

Posts.findAll({writer: 'John Doe'});

์ƒ๊ธฐ ์ฝ”๋“œ๋Š” ์ด๋ฆ„์ด 'John Doe'์ธ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ , ๊ทธ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ Array๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์กฐ๊ฑด ํ™œ์šฉ

find ๋ช…๋ น์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฒซ๋ฒˆ์งธ Object๋Š” ์œ„์™€ ๊ฐ™์ด ๊ฒ€์ƒ‰ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์กฐ๊ฑด์ด๋ฉฐ, ๋‘๋ฒˆ์งธ Object๋Š” limit / skip / sort์™€ ๊ฐ™์€ ์˜ต์…˜์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Posts.findAll({writer: 'John Doe'}, {sort: {createdAt: -1}, skip: 20, limit: 10});

์ƒ๊ธฐ ์ฝ”๋“œ๋Š” ์ด๋ฆ„์ด 'John Doe'์ธ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰ ํ•˜๋˜, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ createdAt ํ•ญ๋ชฉ์— ์—ญ์ •๋ ฌ(๋‚ ์งœ์— ์—ญ์ •๋ ฌ)ํ•œ ํ›„, ์•ž์—์„œ๋ถ€ํ„ฐ 20๊ฐœ ํ•ญ๋ชฉ์„ ์ œ์™ธ(skip)ํ•˜๊ณ , ์ดํ›„ ๋ฐ์ดํ„ฐ ์ค‘ 10๊ฐœ๋งŒ ์ œํ•œ(limit)ํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

Update

ํŠน์ • ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฒซ๋ฒˆ์งธ Object๋กœ ์กฐ๊ฑด์„, ๋‘๋ฒˆ์งธ Object๋กœ ๋ณ€ํ™˜ ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค.

var post_id = Posts.insert({...});
post = Posts.findOne({_id: post_id});
post.name = 'Jane Doe';
Posts.update({_id: post_id}, post);

์œ„ ์ฝ”๋“œ๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ Posts์— ์ €์žฅ ํ›„ ๋ฐ˜ํ™˜ ๋œ _id๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜จ ํ›„ ํŠน์ • ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์‹œ ๊ฐ™์€ _id๋กœ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

Remove

ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šธ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฒซ๋ฒˆ์งธ Object๋กœ ์กฐ๊ฑด์„, ๋‘๋ฒˆ์งธ Object๋กœ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์ˆ˜ ์ผ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Posts.remove({_id: post_id});                        // post_id์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 1๊ฐœ๋งŒ ์ง€์›๋‹ˆ๋‹ค.
Posts.remove({name: 'John Doe'}, {multi: true});     // nameํ•ญ๋ชฉ์ด 'John Doe'์ธ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ง€์›๋‹ˆ๋‹ค.