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

MongoDB에서 슬라이스 체인(Slice of Slice) 구현하는 방법

MongoDB에서 슬라이스 체인이란?

네, MongoDB의 애그리게이션(aggregate) 프레임워크를 활용하면 슬라이스 체인, 즉 '슬라이스의 슬라이스(slice of slice)'를 구현할 수 있습니다. 이는 배열 안에 배열이 중첩되어 있는 경우, 원하는 깊이까지 데이터를 추출하고 싶을 때 유용하게 사용됩니다.

실제 동작 과정을 이해하기 위해 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테스트용 컬렉션 생성

먼저 중첩 배열을 가진 문서를 포함하는 컬렉션을 생성합니다.

> db.sliceOfSliceDemo.insertOne(
...    {
...       "Name": "John",
...       "Details": [["First 1:1", "First 1:2"],["second 2:1","Second 2:2"]]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ccf3fcfdceb9a92e6aa195a")
}

2단계: 저장된 문서 확인

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회하는 쿼리는 다음과 같습니다.

> db.sliceOfSliceDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5ccf3fcfdceb9a92e6aa195a"),
    "Name" : "John",
    "Details" : [
       [
           "First 1:1",
           "First 1:2"
       ],
       [
           "second 2:1",
           "Second 2:2"
       ]
    ]
}

출력 결과를 보면 Details 필드가 배열 안에 배열이 한 번 더 중첩된 2차원 배열 구조임을 확인할 수 있습니다.

3단계: 슬라이스 체인 쿼리 실행

이제 슬라이스의 슬라이스, 즉 MongoDB에서 슬라이스 체인을 구현하는 애그리게이션 쿼리를 살펴보겠습니다.

> db.sliceOfSliceDemo.aggregate([ {$match:{"Name":"John"}}, 
{$unwind:"$Details"},
{$unwind:"$Details"},
{$group:{"_id":"$Name","Details":{$last:"$Details"}}},
{$project:{"Name":"$_id","Details":1}} ]);

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : "John", "Details" : "Second 2:2", "Name" : "John" }

쿼리 동작 원리

각 파이프라인 단계가 어떤 역할을 하는지 자세히 살펴보겠습니다.

  • $match: Name 필드 값이 "John"인 문서만 필터링하여 다음 단계로 전달합니다.
  • $unwind (첫 번째): Details 배열을 개별 요소로 분해합니다. 이 시점에는 각 문서가 내부 배열 하나씩을 가지게 됩니다.
  • $unwind (두 번째): 한 번 더 $unwind를 적용하여 내부 배열까지 완전히 분해합니다. 이것이 바로 '슬라이스 체인'을 만드는 핵심 부분입니다.
  • $group: Name 값을 기준으로 문서를 그룹화하고, $last 연산자를 사용해 각 그룹의 마지막 요소를 선택합니다.
  • $project: 최종 출력 형태를 지정하여 _idName으로 표시하고 Details 필드를 함께 반환합니다.

결과적으로 중첩 배열의 가장 마지막 값인 "Second 2:2"가 추출되어 출력되는 것을 확인할 수 있습니다. 이처럼 $unwind를 중첩 배열의 깊이만큼 반복 적용하면, 몇 단계로 중첩된 배열이라도 원하는 위치의 데이터에 접근할 수 있습니다.