MongoDB에서 배열에 담긴 첫 번째 요소의 특정 속성만 조회하고 싶다면 $slice 연산자를 사용하면 됩니다. $slice는 프로젝션(projection) 단계에서 배열의 일부만 잘라내어 반환해 주는 연산자로, 배열이 긴 문서에서 필요한 데이터만 효율적으로 가져올 때 매우 유용합니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 예시에서는 고객 정보가 배열 형태의 'Details' 필드에 저장되어 있습니다.
> db.firstElementOfArray.insertOne(
... {
... _id: 100,
... "Details": [
... {
... "CustomerName": "John",
... "CustomerCountryName":"US"
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 100 }
> db.firstElementOfArray.insertOne(
... {
... _id: 101,
... "Details": [
... {
... "CustomerName": "Carol",
... "CustomerCountryName":"UK"
... },
... {
... "CustomerName": "David",
... "CustomerCountryName":"AUS"
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }_id가 101인 문서에는 고객 정보 두 개가 배열로 들어 있어, 첫 번째 요소만 추출하는 동작을 명확하게 확인할 수 있습니다.
2. find() 메서드로 전체 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.firstElementOfArray.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 100,
"Details" : [
{
"CustomerName" : "John",
"CustomerCountryName" : "US"
}
]
}
{
"_id" : 101,
"Details" : [
{
"CustomerName" : "Carol",
"CustomerCountryName" : "UK"
},
{
"CustomerName" : "David",
"CustomerCountryName" : "AUS"
}
]
}3. 배열의 첫 번째 요소 속성 조회 쿼리
이제 본론입니다. 배열의 첫 번째 요소에서 'CustomerName' 속성만 가져오려면 아래와 같이 $slice와 프로젝션을 조합한 쿼리를 실행합니다.
> db.firstElementOfArray.find({},{'Details':{$slice:1},'Details.CustomerName':1}).pretty();실행 결과는 다음과 같습니다.
{ "_id" : 100, "Details" : [ { "CustomerName" : "John" } ] }
{ "_id" : 101, "Details" : [ { "CustomerName" : "Carol" } ] }쿼리 동작 원리
결과를 자세히 살펴보면 다음과 같은 특징이 있습니다.
- $slice: 1 — 'Details' 배열에서 첫 번째 요소 하나만 잘라내어 반환합니다. 그래서 _id가 101인 문서에서도 'David'가 아닌 'Carol'만 출력됩니다.
- 'Details.CustomerName': 1 — 배열 요소 중 'CustomerName' 필드만 포함하도록 지정합니다. 덕분에 'CustomerCountryName'은 결과에서 제외됩니다.
이처럼 $slice와 필드 프로젝션을 함께 사용하면 배열 내 특정 위치의 요소에서 원하는 속성만 깔끔하게 추출할 수 있습니다. 참고로 $slice에 음수 값을 넣으면 배열의 마지막 요소부터, 범위 값(예: [1, 2])을 넣으면 특정 구간의 요소들을 가져올 수도 있습니다.