본문 바로가기

MongoDB/Sequence

MongoDB Sequence example

MongoDB에서 자동으로 증가하는 숫자(Sequence)를 생성하고 사용하기



개요

MongoDB에서 Sequence를 생성하려면 db.counters 라는 특별한 시스템 컬렉션을 사용해야 한다

db.counters 컬렉션에 시퀀스를 등록하고 저장 프로시저를 사용하여 해당 시퀀스에 접근하여 값을 변경하는 방식을 사용한다



db.counters 컬렉션에 시퀀스를 생성한다

> db.counters.insert(

   {

      _id: "userid",  // 시퀀스 이름

      seq: 0         // 초기 값

   }

)

WriteResult({ "nInserted" : 1 })



저장 프로시저로 등록할 함수의 원형

function getNextSequence(name) {

   var ret = db.counters.findAndModify(

          {

            query: { _id: name },

            update: { $inc: { seq: 1 } },

            new: true

          }

   );


   return ret.seq;

}



위의 함수를 아래처럼 저장 프로시저로 등록한다


> db.system.js.save( 

   "_id" : "getNextSequence", 

   "value" : function(name) { 

                  var ret = db.counters.findAndModify(

                        {

                           query: { _id:name},

                           update: {$inc: { seq:1}},

                           new: true

                        }

                   );

                   return ret.seq;

              }

})



저장 프로시저로 등록된 함수를 쉘명령으로 확인한다

> db.system.js.find()

{ "_id" : "addNumbers", "value" : function (x,y) { return x+y; } }

{ "_id" : "getNextSequence", "value" : function (name) { var ret = db.counters.findAndModify(

                                                                                {

                                                                                query: { _id:name},

                                                                                update: {$inc: { seq:1}},

                                                                                new: true

                                                                                }

                                                                    );

                                                                    return ret.seq;



몽고쉘에서 저장 프로시저를 호출하여 시퀀스가 증가하는지 확인한다

> db.loadServerScripts()

> getNextSequence("userid")

1

> getNextSequence("userid")

2

> getNextSequence("userid")

3

> getNextSequence("userid")

4

> getNextSequence("userid")

5



커리 안에서 저장함수를 호출하여 시퀀스가 증가하는지 확인한다

> db.member.insert( { "_id" : getNextSequence("userid") , "name" : "홍길동" } )

WriteResult({ "nInserted" : 1 })


> db.member.find()

{ "_id" : 6, "name" : "홍길동" }