MongoDB에서 컬렉션의 문서 수를 제한하는 방법
MongoDB에서 하나의 컬렉션에 저장할 수 있는 문서의 개수를 제한하고 싶다면 Capped(고정 크기) 컬렉션을 사용해야 합니다. 일반적인 컬렉션은 데이터가 계속 쌓이지만, Capped 컬렉션은 미리 정해둔 용량이나 문서 수에 도달하면 가장 오래된 문서부터 자동으로 삭제되는 특징이 있습니다.
1. Capped 컬렉션 생성하기
컬렉션 생성 시 capped: true 옵션을 설정하고, 함께 size(최대 용량, 바이트 단위)와 max(최대 문서 수) 값을 지정합니다.
> db.createCollection("demo683", { capped: true, size: 5, max: 4 })
{ "ok" : 1 }위 예제에서는 최대 4개의 문서만 저장되도록 max: 4로 설정했습니다.
2. 문서 삽입하기
이제 insertOne() 메서드를 사용해 여러 개의 문서를 순차적으로 삽입해 보겠습니다.
> db.demo683.insertOne({Value:100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468afa7e81adc6a0b394e")
}
> db.demo683.insertOne({Value:500});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468b0a7e81adc6a0b394f")
}
> db.demo683.insertOne({Value:1000});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468b1a7e81adc6a0b3950")
}
> db.demo683.insertOne({Value:400});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468b2a7e81adc6a0b3951")
}
> db.demo683.insertOne({Value:800});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468b3a7e81adc6a0b3952")
}
> db.demo683.insertOne({Value:700});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea468b4a7e81adc6a0b3953")
}총 6개의 문서를 삽입했지만, 컬렉션의 최대 문서 수는 4개로 제한되어 있습니다.
3. find() 메서드로 전체 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.
> db.demo683.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ea468b1a7e81adc6a0b3950"), "Value" : 1000 }
{ "_id" : ObjectId("5ea468b2a7e81adc6a0b3951"), "Value" : 400 }
{ "_id" : ObjectId("5ea468b3a7e81adc6a0b3952"), "Value" : 800 }
{ "_id" : ObjectId("5ea468b4a7e81adc6a0b3953"), "Value" : 700 }결과 분석
흥미로운 점은 6개의 문서를 삽입했음에도 실제로는 마지막에 삽입된 4개의 문서(Value: 1000, 400, 800, 700)만 남아 있다는 것입니다. 가장 먼저 삽입된 Value: 100과 Value: 500 문서는 max 제한(4개)을 초과하면서 자동으로 삭제되었습니다. 이처럼 Capped 컬렉션은 FIFO(선입선출) 방식으로 동작하여 항상 최신 데이터만 유지합니다.
Capped 컬렉션 사용 시 주의 사항
- size 우선 적용: size와 max를 모두 지정한 경우, 문서 수가 max에 도달하지 않았더라도 size 용량이 먼저 찰 경우 오래된 문서가 삭제됩니다.
- 문서 삭제 불가: Capped 컬렉션에서는 remove() 등으로 개별 문서를 직접 삭제할 수 없습니다.
- 업데이트 제한: 기존 문서를 수정할 때 문서 크기가 늘어나지 않도록 주의해야 합니다.
- 적합한 용도: 로그 저장, 최근 이벤트 스트림, 캐시 데이터처럼 최신 데이터만 필요한 경우에 유용합니다.