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

MongoDB에서 배열의 첫 번째 요소 속성만 조회하는 방법 ($slice 연산자 활용)

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])을 넣으면 특정 구간의 요소들을 가져올 수도 있습니다.