MongoDB에서 이미 생성된 일반 컬렉션을 capped 컬렉션으로 변환하려면 convertToCapped 명령을 사용하면 됩니다. capped 컬렉션은 지정한 크기 제한에 따라 오래된 문서가 자동으로 삭제되는 순환 구조의 컬렉션으로, 로그 저장 등에 유용하게 활용됩니다.
1. 테스트용 컬렉션 생성
먼저 문서를 포함하는 일반 컬렉션을 만들어 보겠습니다.
> db.demo260.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47b1181627c0c63e7dba9b")
}
> db.demo260.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47b11c1627c0c63e7dba9c")
}
> db.demo260.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47b11f1627c0c63e7dba9d")
}2. find()로 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo260.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e47b1181627c0c63e7dba9b"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47b11c1627c0c63e7dba9c"), "Name" : "Bob" }
{ "_id" : ObjectId("5e47b11f1627c0c63e7dba9d"), "Name" : "David" }3. convertToCapped 명령 실행하기
이제 db.runCommand()를 통해 convertToCapped 명령을 호출합니다. 이때 대상 컬렉션 이름과 함께 size(바이트 단위의 최대 크기)를 반드시 지정해야 합니다.
> db.runCommand( { convertToCapped: 'demo260', size: 8345 } );
{ "ok" : 1 }"ok" : 1이 반환되면 변환이 성공적으로 완료된 것입니다.
4. stats()로 변환 결과 검증하기
stats() 메서드를 호출하여 컬렉션이 실제로 capped로 변환되었는지 확인할 수 있습니다.
> db.demo260.stats()
출력 결과 중 핵심 필드는 다음과 같습니다.
{
"ns" : "test.demo260",
"size" : 112,
"count" : 3,
"avgObjSize" : 37,
"storageSize" : 16384,
"capped" : true,
"max" : -1,
"maxSize" : 8448,
...
"ok" : 1
}결과 분석
- capped : true — 컬렉션이 성공적으로 capped 컬렉션으로 변환되었음을 의미합니다.
- maxSize : 8448 — 지정한 크기(8345바이트)가 MongoDB 내부에서 할당 단위에 맞춰 8448바이트로 조정되었음을 보여줍니다.
- max : -1 — 문서 개수 제한은 설정하지 않고 크기 제한만 적용했음을 나타냅니다.
- count : 3 — 변환 후에도 기존 문서 3개는 그대로 유지됩니다.
참고로 전체 stats() 출력에는 WiredTiger 스토리지 엔진의 상세 통계(LSM, block-manager, cache, cursor 등)가 포함되지만, capped 변환 확인에는 위의 핵심 필드만 보면 충분합니다.
주의 사항
convertToCapped는 원본 컬렉션을 잠그고 데이터를 새 컬렉션으로 복사하는 방식으로 동작하므로, 대량의 데이터가 있는 운영 환경에서는 성능에 영향을 줄 수 있습니다. 또한 변환 과정에서 인덱스는 _id 인덱스만 재생성되며, 사용자가 추가로 만든 인덱스는 유지되지 않으므로 변환 후 필요한 인덱스를 다시 생성해야 합니다.