๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/Node.js MongoDB

[Node.js / MongoDB] ๊ฒŒ์‹œ๋ฌผ๋งˆ๋‹ค ๋ฒˆํ˜ธ ๋‹ฌ๊ธฐ

by Connecting-the-dots 2022. 3. 11.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ ๊ฒŒ์‹œ๋ฌผ๋งˆ๋‹ค _id ๋‹ฌ์•„์„œ ์ €์žฅํ•˜๊ธฐ

  • MongoDB ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ฐ•์ œ๋กœ ์•„์ด๋””๋ฅผ ๊ฐ•์ œ๋กœ ๋ถ€์—ฌํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ, ์ง์ ‘ _id ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒŒ ์ถ”ํ›„์— ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • _id ๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด /add ๊ฒฝ๋กœ๋กœ POST ํ•  ๋•Œ ๋ฐ์ดํ„ฐ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
    (๋ฌผ๋ก  ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์˜ˆ์‹œ๋ผ์„œ _id : 1 ์ด๋ผ๊ณ  ํ•˜๋“œ์ฝ”๋”ฉํ–ˆ์„ ๋ฟ ์‹ค์ œ๋กœ๋Š” ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)
app.post('/add', function(req, res){
  ์‘๋‹ต.send('์ „์†ก ์™„๋ฃŒ');
  db.collection('post').insertOne( { _id : 1, ํ• ์ผ : req.body.content, ๋งˆ๊ฐ์ผ : req.body.date } , function(){
    console.log('๋ฐ์ดํ„ฐ ์ €์žฅ ์™„๋ฃŒ')
  });
});
  • ๋‹ค๋ฅธ DB ์—์„œ๋Š” _id ๋ฅผ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œ์ผœ์„œ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” Auto Increment ๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ MongoDB ์—๋Š” ๊ทธ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์ง์ ‘ ๋ช‡๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐœํ–‰ํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ๋ณดํŽธ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐœํ–‰๋  ๋•Œ๋งˆ๋‹ค 'ํ˜„์žฌ๊นŒ์ง€ ๋ฐœํ–‰๋œ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜ + 1' ์„ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

๐Ÿ’œ ํ˜„์žฌ๊นŒ์ง€ ๋ฐœํ–‰๋œ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜ ๊ธฐ๋กํ•˜๊ธฐ

  • 'ํ˜„์žฌ๊นŒ์ง€ ๋ฐœํ–‰๋œ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜ + 1' ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ๊นŒ์ง€ ๋ฐœํ–‰๋œ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
  • ํ˜„์žฌ๊นŒ์ง€ ๋ฐœํ–‰๋œ ๊ฒŒ์‹œ๋ฌผ ๊ฐœ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด  MongoDB ์—์„œ counter ๋ผ๋Š” collection ์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • counter collection ์„ ์ƒ์„ฑํ–ˆ์œผ๋ฉด, INSERT DOCUMENT ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ค€๋‹ค.

  • totalPosts ํ•ญ๋ชฉ์€ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ ํƒ€์ž…์€ Int32๋กœ, ์ดˆ๊ธฐ๊ฐ’์€ 0์œผ๋กœ ์…‹ํŒ…ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์•ž์œผ๋กœ๋Š” ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๋ฌผ์ด ๋ฐœํ–‰๋˜๋ฉด totalPosts ์— ๋ช‡๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์ด ๋ฐœํ–‰๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก ๋ฐ ์ €์žฅ๋œ๋‹ค.

๐Ÿ’œ POST ์š”์ฒญ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๊ธฐ

// ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํผ์—์„œ /add ๋กœ POST ์š”์ฒญ์„ ํ•˜๋ฉด
app.post('/add', function(req, res){
    res.send('์ „์†ก์™„๋ฃŒ');

    // ๊ฒŒ์‹œ๋ฌผ๋งˆ๋‹ค ๋ฒˆํ˜ธ๋ฅผ ๋‹ฌ์•„ ์ €์žฅํ•˜๊ธฐ
    // DB.counter ๋‚ด์—์„œ '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜'๋ฅผ ์ฐพ์•„์„œ
    db.collection('counter').findOne({name : '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜'}, function(err, result){
        // console.log(result.totalPosts);

        // '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜' ์˜ totalPosts ๊ฐ’์„ totalPosts ๋ณ€์ˆ˜์— ์ €์žฅ
        var totalPosts = result.totalPosts;

        // ์ด์ œ DB.post ์— ๋ฒˆํ˜ธ๋ฅผ ๋‹จ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€
        db.collection('post').insertOne({_id : totalPosts + 1, ํ• ์ผ: req.body.content, ๋งˆ๊ฐ์ผ : req.body.date}, function(err, result){
            console.log('๋ฐ์ดํ„ฐ ์ €์žฅ ์™„๋ฃŒ!');

            // DB.counter ์˜ '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜' ์˜ totalPosts ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€
            db.collection('counter').updateOne({name : '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜'},{ $inc : {totalPosts: 1} }, function(err, result){
                console.log('๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ!');
            });
        });
    });  
})
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” updateOne() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ 3๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
    • ์ขŒ์ธก : {name : '์ด๊ฒŒ์‹œ๋ฌผ๊ฐœ์ˆ˜'} ์™€ ๊ฐ™์€ ์ž๋ฃŒ์˜ ์ด๋ฆ„ ํ˜น์€ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑ
    • ์ค‘์•™ : operator ๋ฌธ๋ฒ• ๋ฐ ์ ์šฉ๋  ์ž๋ฃŒ ์ž‘์„ฑ
      $set ์€ ์ž๋ฃŒ์˜ ๊ฐ’์„ ๊ธฐ์žฌ๋œ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ, $inc ๋Š” ๊ธฐ์žฌ๋œ ์ˆซ์ž๋งŒํผ ์ž๋ฃŒ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ!
    • ์šฐ์ธก : ์ฝœ๋ฐฑํ•จ์ˆ˜
  • ๋”ฐ๋ผ์„œ, ๋ฐ์ดํ„ฐ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ฏ€๋กœ { $inc : {totalPosts : 1} } ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ DB ์—์„œ ๊ฒŒ์‹œ๋ฌผ _id ๋ถ€์—ฌ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ

๐Ÿค counter

 

๐Ÿค post

728x90
๋ฐ˜์‘ํ˜•