본문 바로가기
Server/Node.js

게시물에 번호 부여하기

by print_soo 2023. 8. 31.

해당 글은 이전 글들의 작업을 이어서 진행되고 있는 글입니다.

 

 

MongoDB에 데이터를 저장할 때는 _id라는 값을 넣어줘야한다. 그렇지 않으면 이상한 값이 _id로 들어가버린다. 

 

대부분 _id 값은 게시물의 개수에 따라서 부여(1번 게시물 id: 1 2번 게시물 id: 2 ...) 하는데 이렇게 하기 위해서는 하드코딩 또는 자동으로 1씩 증가해서 id를 부여해야한다. 다른 DB에는 자동으로 id 값을 증가시켜 추가해주는 Auto Increment라는 기능이 있지만 Mongo DB에는 해당 기능이 없기에 직접 만들어야한다. 

 

그래서 우리가 할 방법을 간단하게 설명하면 아래와 같다. 

  1. counter라는 Collection을 하나 만든다.
  2. counter에 totalPost라는 데이터를 저장한다.
  3. 누군가 post를 할 때마다 counter에서 totalPost를 가져와서 + 1 해준 값을 id 값으로 넣는다.
  4. 동시에 counter의 totalPost에 증가된 값을 저장한다. 

1. counter라는 Collection을 만든다.

 

 


2. counter에 totalPost라는 데이터를 저장한다.

INSERT DOCUMENT 클릭


3. 누군가 post를 할 때마다 counter에서 totalPost를 가져와서 + 1 해준 값을 id 값으로 넣는다.

app.post('/newposts', function (request, response) {   
    db.collection('counter').findOne({name: 'postsNum'}, function (error, result) { //name이 postNum이라는 데이터가져오기
        console.log(`게시물 개수: ${result}`); 
        var totalPost = result.totalPost; //가져온 데이터의 totalPost 값을 변수에 저장
        db.collection('post').insertOne({ _id: (totalPost + 1), title: request.body.title, date: request.body.date}, function (error, result) {
        	console.log(result);
        });
        response.send(`수정완료`);
    })
});

4. 동시에 counter의 totalPost에 증가된 값을 저장한다. 

updateOne이라는 함수를 사용해서 totalPost의 값을 변경해보자.

// [updateOne 함수의 기본형식]

updateOne( 변경할 데이터 , 데이터를 어떻게 바꿀건지 , function (error, result) {

});

 

따라서 우리는 name이 postsNum라는 데이터의 totalPost를 1씩 증가시킬 것이기 때문에 아래와 같이 작성해준다.

db.collection('counter').updateOne( {name : 'postsNum' } , { $inc : { totalPost : 1 } } , function (error, result) {
    if (error) {return console.log(error)};
});

 

해당 코드에서 $inc라는 갱신제한자가 있다. $inc는 해당 키의 값을 작성된 숫자만큼 더해준다. (-를 작성하면 뺴준다.)

 

 

  • [갱신 제한자]
    • $set
      • document에서 특정 키의 값을 수정합니다. 특정 키가 존재하지 않다면 새롭게 생성합니다.
        특정 키의 데이터형도 수정할 수 있습니다.
    • $unset
      • document에서 특정 키와 값을 모두 제거합니다.
    • $nc
      • 배열에 사용되는 제한자로써, 지정된 키가 존재하는지 확인할 수 있습니다.
    • $inc
      • 이미 존재하는 키의 값을 수정하거나, 새로운 키를 생성합니다. $set과 비슷하지만 주로 값이 자주 변경되는 값을 수정하는데 사용됩니다.
        int, long, double 의 자료형에만 사용이 가능합니다.
    • $push
      • 배열에 사용되는 제한자로써, 지정된 키가 존재할 때 해당 키(배열)의 끝에 요소를 추가하며 지정된 키가 존재 하지 않으면 새로운 배열을 추가합니다.
    • $pull
      • 배열에 사용되는 제한자로써, 지정된 키에 대한 요소를 삭제합니다.
    • $addToSet
      • 배열에 사용되는 제한자로써, 중복을 피해서 요소를 배열에 추가할 때 사용합니다. 즉, $nc와 $push를 함께 수행하는 기능과 같습니다.
    • $each 
      • $addToSet과 함께 사용되는 제한자로써, 여러 개의 값을 중복되지 않게 배열에 추가합니다.
    • $pop
      • 배열을 스택이나 큐처럼 활용할 수 있습니다.

 

[전체 코드]

app.post('/newposts', function (request, response) {
        
    db.collection('counter').findOne({name: 'postsNum'}, function (error, result) {
        console.log(`게시물 개수: ${result}`);
        var totalPost = result.totalPost;
        console.log(`totalPost: ${totalPost}`);
        
        
        db.collection('post').insertOne({ _id: (totalPost + 1), title: request.body.title, date: request.body.date}, function (error, result) {
        console.log(result);
            db.collection('counter').updateOne( {name : 'postsNum' } , { $inc : { totalPost : 1 } } , function (error, result) {
                if (error) {return console.log(error)};
            });
        });
        response.sendFile(__dirname + '/success.html');

        
    })
    
});