해결된 질문
작성
·
244
1
선생님 안녕하세요. 강의 정말 잘듣고 있습니다. 감사드립니다.
강의를 보다가 궁금한 점이 생겼는데요. 블로그에 코멘트를 넣을 때, 이렇게 했는데,
const comment = new Comment({ content, user, blog });
await Promise.all([
comment.save(),
Blog.updateOne({ _id: blogId }, { $push: { comments: comment } }),
]);
저는 처음에 이걸 보고 comment 콜렉션에 들어가는 다큐먼트와 blog에 들어가는 comment의 Id 가 다를 거라고 생각했어요. comment의 id는 디비에 직접 삽입 된 후에 반환될 거라고 생각했습니다. 그래서 promise.all을 이용해 한번에 처리하는 게 아니라, 순차적으로 await을 붙여서 해줘야 한다고 생각했었는데요. 그런데 결과를 보니 comment의 id와 블로그에 들어가 있는 comment의 id가 같더라구요. 정말 신기했습니다.
그래서 궁금한게, comment의 id는
const comment = new Comment({ content, user, blog });
이 시점에서 생성되는 건가요? 아니면 다른 뭔가가 있을까요?? 궁금합니다~
답변 1
1
좋은 질문입니다!
많은 개발자들이 익숙한 관계형 데이터베이스는 말씀하신대로 디비에서 primary key를 생성해서 주는 경우가 많아요. 몽고디비에서는 예상하신 new Comment 부분에서 아이디가 생성됩니다. 이게 가능한 이유는 관계형에서는 보통 auto increment로 아이디를 만들게 되는데 그러면 순서를 보장하기 위해서 디비 안에서 아이디가 생성되요. 그에 반면 몽고디비는 "랜덤"한 아이디를 생성하기 때문에 백엔드 서버에서 사전에 생성 후 저장이 가능해지죠. 이런 경우는 확률적으로 사실상 없다고 볼 수 있지만 혹시라도 중복된 아이디로 저장을 시도하게 되면 _id에 기본설정으로 unique index가 걸려 있어서 오류 처리가 됩니다.