본문 바로가기

Server-DB/MongoDB

MongoDB를 관계형 데이터 베이스처럼 사용하는 법

MongoDB는 대표적인 NoSQL로서 기존에 사용하던 DB처럼 사용하고 싶은데, 그러지 못할 때 다소 아쉬운 부분이 있다. 그럴 때, 한 가지 편법이 있다.

 

MongoDB에 들어가서, 인덱스를 담당하는 Collection을 별도로 만든 뒤, 데이터를 DB에 저장할 때 마다 그 때 그 때 해당 인덱스를 업데이트 해주면 된다. 

 

// /add경로로 POST 요청을 하면, 그 내용을 DB 폴더에 저장
app.post('/add', function(req, res){
    
    // /write에서 글 작성 후 사용자에게 보여줄 부분
    res.send('전송완료')

    // 글번호를 붙혀서 post collection에 작성한 내용을 저장하는 부분
    db.collection('counter').findOne({name : '게시물갯수'}, function(에러, 결과){
        
        // counter collection의 totalPost를 가져와서, 
        console.log(결과.totalPost);
        var 총게시물갯수 = 결과.totalPost;

        // 그걸로 id를 지정하고, POST 요청의 내용들을 post collection에 저장하는 부분
        db.collection('post').insertOne({_id : 총게시물갯수 + 1, 제목 : req.body.title, 날짜 : req.body.date}, function(에러, 결과){
            // console.log(req.body.title)
            // console.log(req.body.date)
            console.log('post폴더에 저장완료');

            // 작성한 내용 저장 후 counter collection에 있는 totalPost의 항목을 '1'만큼 증가시킴
            db.collection('counter').updateOne({name:'게시물갯수'}, { $inc : {totalPost:1} }, function(에러, 결과){
                if (에러) {return console.log(에러)}
            });
        });

    });
    
});

node.js(express) 환경에서 작성한 코드이다. 게시물 갯수만 세는 별도의 collection(counter)를 만들어놓고, 글을 쓸 때마다, couter라는 collection에 담긴 총게시물갯수를 불러온다. 그리고 글의 제목, 내용과 함께 id 값을 총 게시물갯수로 지정할 수 있다. 저장이 잘 되면, 다시 post라는 collection이 아닌 counter라는 collection에 담긴 총 게시물 갯수를 업데이트해준다.

 

MongoDB를 열어서 해당 내용을 보면 다음과 같이 보인다.

DB에 담긴 Collection들의 모습

todoapp이라는 DB안에 counter, post 각각의 collection을 만들었다. 여기서 counter가 post의 인덱스처럼 기능한다. 

counter라는 collection의 totalPost값이 인덱스처럼 기능
post라는 collection에 담긴 데이터들은 _id 값으로 totalPost의 값을 받는다

 

이렇게 인덱스처럼 기능하는 별도의 collection을 만들어 놓으면, 해당 글에 댓글기능을 넣을 때도, 인덱스값을 totalPost로 설정해놓으면, 해당 글에 해당하는 댓글만 불러오도록 만들 수 있다.