MongoDB는 기본적으로 MySQL 같은 관계형 데이터베이스의 AUTO_INCREMENT와 유사한 자동 증가 기능을 제공하지 않습니다. 하지만 findAndModify() 메서드를 활용하면 직접 시퀀스(연속된 번호)를 생성하고 수정할 수 있습니다. 이번 글에서는 실제 예제를 통해 MongoDB에서 시퀀스를 만들고 값을 하나씩 증가시키는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 insertOne() 메서드로 문서가 포함된 컬렉션을 생성합니다.
> db.demo261.insertOne({_id:100,Name:"Chris"});
{ "acknowledged" : true, "insertedId" : 100 }2. 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo261.find();
실행 결과는 다음과 같습니다.
{ "_id" : 100, "Name" : "Chris" }3. 시퀀스 카운터 컬렉션과 함수 정의
시퀀스 값을 저장할 별도의 카운터 컬렉션(demo262)을 만들고, findAndModify()를 이용해 값이 자동으로 1씩 증가하는 함수를 정의합니다.
> db.demo262.insert({_id:"newId",sequence_value:0})
WriteResult({ "nInserted" : 1 })
> function getNext(sName){
...
... var d= db.demo262.findAndModify({
... query:{_id: sName},
... update: {$inc:{sequence_value:1}},
... new:true
... });
... return d.sequence_value;
...}여기서 핵심은 $inc 연산자입니다. 이 연산자가 sequence_value 필드의 값을 호출할 때마다 1씩 증가시키며, new:true 옵션은 업데이트된 최신 문서를 반환하도록 합니다.
4. 함수를 호출해 시퀀스 기반 문서 삽입
이제 위에서 정의한 getNext() 함수를 호출하여 자동으로 증가하는 _id 값을 가진 문서를 삽입합니다.
> db.demo261.insert({
... "_id":getNext("newId"),
... "Name":"Chris"
... })
WriteResult({ "nInserted" : 1 })
> db.demo261.insert({ "_id":getNext("newId"), "Name":"Bob" })
WriteResult({ "nInserted" : 1 })5. 최종 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo261.find();
실행 결과는 다음과 같습니다.
{ "_id" : 100, "Name" : "Chris" }
{ "_id" : 1, "Name" : "Chris" }
{ "_id" : 2, "Name" : "Bob" }출력 결과를 보면, 새로 삽입된 문서들이 _id 값이 1, 2처럼 순차적으로 자동 증가한 것을 확인할 수 있습니다. 이처럼 findAndModify()와 $inc 연산자를 조합하면 MongoDB에서도 안정적으로 시퀀스를 구현하고 수정할 수 있습니다.