MongoDB에서 배열에 capped를 사용할 수 없는 이유와 $slice 대안
MongoDB에서는 배열(하위 컬렉션)에 직접 capped 옵션을 적용할 수 없습니다. capped는 컬렉션 전체에만 설정할 수 있는 옵션이기 때문입니다. 따라서 배열에서 특정 개수의 값만 조회하고 싶다면 $slice 연산자를 사용하는 것이 올바른 방법입니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo319.insertOne({"Scores":[100,345,980,890]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ecf6f8647eb59e562064")
}
> db.demo319.insertOne({"Scores":[903,10004,84575,844]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ed01f8647eb59e562065")
}2. find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo319.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e50ecf6f8647eb59e562064"),
"Scores" : [
100,
345,
980,
890
]
}
{
"_id" : ObjectId("5e50ed01f8647eb59e562065"),
"Scores" : [
903,
10004,
84575,
844
]
}3. $slice로 배열의 일부만 조회하기
배열에서 앞쪽 값 몇 개만 가져오려면 집계(aggregation) 파이프라인에서 $project와 $slice를 함께 사용합니다. 아래는 각 문서의 Scores 배열에서 처음 2개의 값만 추출하는 쿼리입니다.
> db.demo319.aggregate([
... { $project: {TwoScores: { $slice: [ "$Scores", 2 ] } } }
... ])실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e50ecf6f8647eb59e562064"), "TwoScores" : [ 100, 345 ] }
{ "_id" : ObjectId("5e50ed01f8647eb59e562065"), "TwoScores" : [ 903, 10004 ] }추가 팁: $slice의 다양한 활용법
$slice는 단순히 앞에서부터 자르는 것 외에도 유용하게 활용할 수 있습니다.
- 음수 값 사용:
{ $slice: [ "$Scores", -2 ] }처럼 음수를 지정하면 배열의 마지막 요소부터 역순으로 값을 가져옵니다. - 시작 위치 지정:
{ $slice: [ "$Scores", 1, 2 ] }처럼 두 개의 인자를 사용하면 인덱스 1부터 2개의 요소를 건너뛰어 조회합니다.
이처럼 MongoDB에서 배열 크기를 제한하고 싶을 때는 capped가 아닌 $slice 연산자를 사용하면 됩니다. find() 쿼리의 프로젝션 단계에서도 동일하게 $slice를 사용할 수 있으므로 상황에 맞게 선택하여 활용하시기 바랍니다.