MongoDB에서 이미 생성된 일반 컬렉션을 Capped(고정 크기) 컬렉션으로 변환하려면 runCommand() 메서드를 사용해야 합니다. 이 메서드는 지정한 데이터베이스 명령을 실행할 수 있는 헬퍼(helper) 기능을 제공합니다.
Capped 컬렉션은 삽입 순서를 유지하며, 설정된 최대 크기를 초과하면 가장 오래된 문서부터 자동으로 덮어써지는 특수한 컬렉션입니다. 로그 데이터나 최근 정보만 유지하면 되는 경우에 유용하게 활용됩니다.
1단계: 테스트용 컬렉션 생성
먼저 문서를 포함하는 일반 컬렉션을 만들어 보겠습니다.
> db.demo416.insertOne({"StudentName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e723a7bb912067e57771adf")
}
> db.demo416.insertOne({"StudentName":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e723a81b912067e57771ae0")
}
> db.demo416.insertOne({"StudentName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e723a84b912067e57771ae1")
}2단계: find()로 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo416.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e723a7bb912067e57771adf"), "StudentName" : "David" }
{ "_id" : ObjectId("5e723a81b912067e57771ae0"), "StudentName" : "Mike" }
{ "_id" : ObjectId("5e723a84b912067e57771ae1"), "StudentName" : "Sam" }3단계: convertToCapped 명령으로 변환하기
이제 runCommand()에 convertToCapped 옵션을 전달하여 컬렉션을 Capped 형태로 변환합니다. size 값은 바이트 단위의 최대 크기를 의미합니다.
> db.runCommand( { convertToCapped: 'demo416', size: 100} );
{ "ok" : 1 }결과가 { "ok" : 1 }로 반환되면 변환이 성공적으로 완료된 것입니다.
4단계: stats()로 변환 결과 검증하기
stats() 메서드를 호출하여 컬렉션이 실제로 Capped로 변환되었는지 확인할 수 있습니다.
> db.demo416.stats();
출력 결과 중 핵심 필드는 다음과 같습니다.
{
"ns" : "test.demo416",
"size" : 132,
"count" : 3,
"avgObjSize" : 44,
"storageSize" : 16384,
"capped" : true,
"max" : -1,
"maxSize" : 256,
...
}출력 결과에서 "capped" : true 항목을 확인하면 컬렉션이 성공적으로 Capped 컬렉션으로 변환되었음을 알 수 있습니다. 또한 maxSize 필드에는 지정한 최대 크기가 반영됩니다.
Capped 컬렉션 변환 시 주의사항
- 크기 제한:
size옵션은 바이트 단위이며, MongoDB는 지정된 크기를 256바이트 단위로 올림하여 적용합니다. - 문서 수 제한: 필요하다면
convertToCapped명령에max옵션을 추가하여 저장 가능한 최대 문서 수도 함께 지정할 수 있습니다. - TTL 인덱스와 병행 불가: Capped 컬렉션은 TTL(Time-To-Live) 인덱스를 사용할 수 없으므로, 만료 기반 삭제가 필요하다면 일반 컬렉션과 TTL 인덱스 조합을 고려해야 합니다.
- 업데이트 제약: Capped 컬렉션에서는 문서 크기를 늘리는 업데이트 작업이 허용되지 않습니다.
이처럼 runCommand()와 convertToCapped 명령을 활용하면 기존 컬렉션의 데이터를 그대로 유지하면서 손쉽게 Capped 컬렉션으로 전환할 수 있습니다.