Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 배열에서 capped 대신 $slice로 하위 데이터 제한하는 방법

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를 사용할 수 있으므로 상황에 맞게 선택하여 활용하시기 바랍니다.