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 응답 크기를 줄이거나 미리보기 데이터를 조회할 때 매우 유용합니다.