MongoDB에서 배열의 일부만 조회하고 싶을 때는 $slice 연산자를 사용하면 됩니다. $slice 연산자는 find() 쿼리의 프로젝션 단계에서 배열 필드에 포함될 요소의 개수나 범위를 지정할 수 있게 해줍니다.
예제 컬렉션 생성
먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.
> db.demo503.insertOne({_id:1,Name:"John",Subject:["MySQL","Java","C"]});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo503.insertOne({_id:2,Name:"David",Subject:["MongoDB","C++","Python"]});
{ "acknowledged" : true, "insertedId" : 2 }find() 메서드로 전체 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.demo503.find().pretty();
위 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "Name" : "John", "Subject" : [ "MySQL", "Java", "C" ] }
{
"_id" : 2,
"Name" : "David",
"Subject" : [
"MongoDB",
"C++",
"Python"
]
}$slice 연산자로 배열 슬라이스하기
이제 특정 필드의 배열을 슬라이스하는 쿼리를 살펴보겠습니다. 아래 예제에서는 _id가 2인 문서의 Subject 배열에서 마지막 요소 하나만 가져옵니다.
> db.demo503.find({_id:2}, { 'Subject': { $slice: -1 }});실행 결과는 다음과 같습니다.
{ "_id" : 2, "Name" : "David", "Subject" : [ "Python" ] }$slice 연산자 사용법 정리
$slice 연산자는 값에 따라 동작 방식이 달라집니다.
- 양수(n): 배열의 앞에서부터 n개의 요소를 반환합니다. 예:
{ $slice: 2 } - 음수(-n): 배열의 뒤에서부터 n개의 요소를 반환합니다. 위 예제의
{ $slice: -1 }은 마지막 요소인 "Python"만 반환했습니다. - [skip, limit] 형식: 첫 번째 값만큼 건너뛴 후 두 번째 값만큼의 요소를 반환합니다. 예:
{ $slice: [1, 2] }는 인덱스 1부터 2개의 요소를 반환합니다.
이처럼 $slice 연산자를 활용하면 대용량 배열 필드에서 필요한 부분만 효율적으로 조회할 수 있어 네트워크 트래픽과 애플리케이션 성능 최적화에 유용합니다.