brunch

You can make anything
by writing

C.S.Lewis

by 쿠우보이 Oct 19. 2017

몽고 디비 학습기

고유 인덱싱

몽고 디비는 collection을 저장하면 자동으로 UUID와 비슷한 결과물의 unique id를 각 field에 붙여준다. 당연히 중복 id로 저장 시도 시 duplicate error를 낸다. 


어떠한 이유에서든지, SQL에서 autoIncrement로 0,1,2,3과 같은 숫자 index를 사용코자 한다면 몽고 디비는 자동으로 지원하지는 않는다. 아직 정확히 왜 이런 숫자 index가 필요한지 모르겠지만, 이런 비슷한 내용을 모사하고 싶다면 방법이 있다.


몽고 디비 사람들이 친절하게도 설명해 준다. 

https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/


자 위 공식 문서는 영어로 되어있으므로 나의 유치한 한국어로 다시 풀어보자. 


우선 db에 counter라는 collection을 만들고 "userid"라는 string 값을 가지는  _id를 지정해 준다. 그다음 앞으로 증가시켜갈 seq 값을 초기값 0으로 놓는다. 


그다음 getNextSequence라는 함수를 만든다. mongo shell에선 그냥 이 함수를 적어서 박아버리면 어딘가에 함수가 저장된다. (신기 신기).  


system상에서 script로 실행되게 하기 위해선 원하는 collection 이 저장되기 전 hook method 인. pre를 사용하면 된다. (오늘 진행할 부분) 그러면 "userid"라는 collection 에 field를 추가해서 저장할 때마다 이 pre hook 이 실행돼서 해당 name의 필드를 찾고 seq를 1씩 증가시켜서 저장하게 된다. 

http://mongoosejs.com/docs/middleware.html


다시 mongo shell에서 진행한다고 한다면, 아래와 같이 users를 insert 해 준다. 


그다음 query로 확인해 보면


 _id 가 아래와 같이 몽고 디비의 일반적인 objectId가 아닌

무시무시한 mongoDB의 objectId, 요즘은 얘가 좋다

 아래 _id 쪽을 보면 SQL과 같은 autoIncrement row index로 저장되어있는 것을 볼 수 있다. 


다시 말하면 왜 이렇게 해야 하는지 정확히 어떤 이점이 있는지 모르겠지만 일단 요구사항에 있기에 이렇게 만들어 보고자 한다. id로 접근을 하진 않을 것 같은데 말이다... 언젠간 이유를 정확히 알겠지. 

매거진의 이전글 SQL? NoSQL?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari