λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] 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
λ°˜μ‘ν˜•