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

MongoDB에서 $slice로 필드(배열)의 반환 값 제한하기

MongoDB에서 배열 필드에 포함된 요소 중 일부만 조회하고 싶을 때는 $slice 연산자를 활용하면 됩니다. $slice는 쿼리의 프로젝션(projection) 단계에서 배열의 일부만 잘라내어 반환하므로, 대량의 배열 데이터 중 필요한 만큼만 효율적으로 가져올 수 있습니다.

먼저 예제에 사용할 문서가 담긴 컬렉션을 생성해 보겠습니다.

1. 컬렉션 및 문서 생성

> db.demo594.insertOne(
...     {
...        id:1,
...        details:[
...           {Name:"Chris",Age:21},
...           {Name:"Bob",Age:20},
...           {Name:"David",Age:23},
...           {Name:"Sam",Age:22}
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e933459fd2d90c177b5bcdd")
}

insertOne() 메서드가 정상적으로 실행되면 acknowledged 값이 true로 반환되며, 새로 생성된 문서의 ObjectId도 함께 확인할 수 있습니다.

2. find() 메서드로 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo594.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e933459fd2d90c177b5bcdd"), "id" : 1, "details" : [
    { "Name" : "Chris", "Age" : 21 },
    { "Name" : "Bob", "Age" : 20 },
    { "Name" : "David", "Age" : 23 },
    { "Name" : "Sam", "Age" : 22 }
] }

현재 details 배열에는 Chris, Bob, David, Sam 총 4개의 요소가 모두 포함되어 있는 것을 확인할 수 있습니다.

3. $slice로 필드의 반환 값 제한하기

이제 details 배열에서 첫 번째 요소 하나만 반환되도록 쿼리를 작성해 보겠습니다.

> db.demo594.find({}, {"Name": 1, "details": { "$slice": 1}});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e933459fd2d90c177b5bcdd"), "details" : [
    { "Name" : "Chris", "Age" : 21 } 
] }

$slice에 1을 지정했기 때문에 배열의 첫 번째 요소인 Chris 문서만 반환된 것을 볼 수 있습니다.

$slice 동작 방식 정리

  • { $slice: n } — 배열의 처음 n개 요소만 반환합니다.
  • { $slice: -n } — 배열의 마지막 n개 요소만 반환합니다.
  • { $slice: [skip, limit] } — 앞에서 skip개의 요소를 건너뛴 후 limit개만큼 반환합니다.

참고로 위 쿼리에서 "Name": 1 옵션을 함께 지정했지만, Name 필드가 문서의 최상위 레벨에는 존재하지 않으므로 결과에는 영향을 주지 않았습니다. 이처럼 $slice를 활용하면 배열 필드의 반환 개수를 손쉽게 제어할 수 있어, API 응답 크기를 줄이거나 미리보기 데이터를 조회할 때 매우 유용합니다.