MongoDB에서 Sequence 사용하기 on Node.js
MongoDB에서 Sequence 사용하기 on Node.js
MongoDB는 Oracle이나 PostgreSQL의 Sequence나 MySQL의 Auto Increment 같은 기능이 없습니다. 반면 MongoDB에 익숙한 사람들은 12-byte로된 Object_ID에 더 익숙할겁니다. MongoDB는 자동 증가 시퀀스를 기본 기능으로 지원하지 않지만 이 기능은 카운터 컬렉션을 사용하여 프로그래밍 방식으로 구현이 가능합니다.
{ "_id" : 1, "title" : "책이름", "author" : [ "저자1", "저자2" ], "published_date" : ISODate("1970-01-01T09:00:00.000+09:00"), "pages" : 216, "language" : "한국어", "publisher" : { "name" : "출판사", "founded_date" : 2021, "location" : "소재지" } }, { "_id" : 2, "title" : "MongoDB: The Definitive Guide", "author" : [ "Kristina Chodorow", "Mike Dirolf" ], "published_date" : ISODate("2010-09-24T09:00:00.000+09:00"), "pages" : 216, "language" : "English", "publisher" : { "name" : "O'Reilly Media", "founded" : 1980, "location" : "CA" } }
Object_id (_id)에 Auto Increment를 사용하는 방법
- SEQ Count에 사용할 seq collection 생성
> db.createCollection("seq") { "ok" : 1 } >
- Collection에 데이터 삽입
> db.seq.insert ( {_id: "seq_no" , seq_value : 0 } ) WriteResult ( { "nInserted" : 1 } ) >
- seq 데이터 확인
> db.seq.find({}) { "_id" : "seq_no", "seq_value" : 0 }
- Javascript Function 생성하기
function autoIncObjectId(seqName){ var autoInc = db.seq.findAndModify({ query: {_id: seqName }, update: { $inc: {seq_value:1}}, new: true }); return autoInc.seq_value; }
- Javascript 함수 사용하여 데이터 Insert
db.book.insert({ "_id" : autoIncObjectId("seq_no"), "title" : "책이름", "author" : [ "저자1", "저자2" ], "published_date" : ISODate("1970-01-01T09:00:00.000+09:00"), "pages" : 216, "language" : "한국어", "publisher" : { "name" : "출판사", "founded_date" : 2021, "location" : "소재지" } }); db.book.insert({ "_id" : autoIncObjectId("seq_no"), "title" : "MongoDB: The Definitive Guide", "author" : [ "Kristina Chodorow", "Mike Dirolf" ], "published_date" : ISODate("2010-09-24T09:00:00.000+09:00"), "pages" : 216, "language" : "English", "publisher" : { "name" : "O'Reilly Media", "founded" : 1980, "location" : "CA" } });
MongoDB 안에 함수를 저장해 두고 사용하는 방법도 있지만, 소스 상에서 함수를 이용해 데이터를 입력할 수도 있습니다.
해당 방법의 단점은 역시 MySQL 처럼 clustered index가 아니기 때문에 중간에 데이터 삭제가 되어도 PK값의 순서대로 끼워 넣는 것은 불가능하다는 것과, Sequence를 사용하는 컬렉션 마다 별도의 카운터 컬렉션을 생성해줘야하는 것, 틀어졌을때 수동으로 관리를 해줘야 하는 점 등이 있습니다.
Object_id를 사용하는 것이 유니크한 값을 사용하고, 시간정보등이 들어있고 12-byte 고정이기 때문에 더 많은 장점이 있긴 합니다만, 부득이하게 시퀀스 타입을 사용해야 한다면 위 같이 프로그래밍을 통한 방법을 구현 할 수 있습니다.
안녕하세요. 게시글 보고 궁금한 부분이 생겨 코멘트 남깁니다.
컬렉션마다 별도의 카운터 컬렉션을 설정해야 하는 이유가 따로 있을까요? Sequence Collection 을 만들어 field에 다른 collection name을 추가하면 되지 않을까 싶어서요
이 기능 MySQL의 auto_increment 처럼 연속된 숫자값으로 _id를 생성하기 위함입니다. _id는 램덤으로 유니크하게 생성되지만 떄로는 연속된 숫자값으로 된 키값이 필요할 때도 있기 때문이에요. 오라클이나 PostgreSQL의 시퀀스 처럼 사용하는 겁니다.