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: 최종 출력 형태를 지정하여
_id를Name으로 표시하고Details필드를 함께 반환합니다.
결과적으로 중첩 배열의 가장 마지막 값인 "Second 2:2"가 추출되어 출력되는 것을 확인할 수 있습니다. 이처럼 $unwind를 중첩 배열의 깊이만큼 반복 적용하면, 몇 단계로 중첩된 배열이라도 원하는 위치의 데이터에 접근할 수 있습니다.