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

MongoDB $project에서 $concatArrays로 기존 다중 배열 필드 하나로 합치기

MongoDB $concatArrays 연산자란?

MongoDB의 $concatArrays는 여러 개의 배열을 하나로 이어 붙여(concatenate) 새로운 배열을 반환하는 집계 연산자입니다. 특히 중첩 배열(nested array) 구조를 평탄화(flatten)할 때 $reduce와 함께 사용하면 매우 유용합니다.

이번 글에서는 기존에 저장된 다중 배열 필드를 $project 단계에서 $concatArrays로 하나의 배열로 합치는 방법을 예제와 함께 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 문서를 포함하는 컬렉션을 생성합니다. 아래 예제에서는 Marks1 필드가 배열 안에 배열이 들어 있는 중첩 구조입니다.

> db.demo338.insertOne({"Name":"Chris","Marks1":[ [56,67,45],[67,89,90,91]]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e5299baf8647eb59e56209f")
}

2. 저장된 문서 확인하기

find() 메서드와 pretty()를 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.

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

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

{
    "_id" : ObjectId("5e5299baf8647eb59e56209f"),
    "Name" : "Chris",
    "Marks1" : [
       [
          56,
          67,
          45
       ],
       [
          67,
          89,
          90,
          91
       ]
    ]
}

3. $project와 $reduce로 배열 합치기

이제 기존의 다중 배열 필드(Marks1)에 대해 집계 파이프라인의 $project 단계에서 $reduce$concatArrays를 조합하여 모든 하위 배열을 하나의 배열로 합쳐 보겠습니다.

  • input: 반복 대상이 되는 원본 배열 필드($Marks1)를 지정합니다.
  • initialValue: 누적 결과를 담을 초기값으로 빈 배열([])을 설정합니다.
  • in: 각 반복마다 현재 요소($$this)와 누적 값($$value)을 $concatArrays로 연결합니다.
> db.demo338.aggregate([
...    { "$project": {
...       "Marks": {
...          "$reduce": {
...          "input": "$Marks1",
...          "initialValue": [],
...          "in": { "$concatArrays": ["$$this", "$$value"] }
...       }
...    }
...  }}
... ])

4. 실행 결과 확인

위 집계 쿼리를 실행하면 중첩되어 있던 두 개의 배열이 하나의 평탄화된 배열로 합쳐진 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e5299baf8647eb59e56209f"), "Marks" : [ 67, 89, 90, 91, 56, 67, 45 ] }

정리

$reduce$concatArrays를 조합하면 MongoDB에서 중첩 배열 구조를 손쉽게 평탄화할 수 있습니다. 이 패턴은 점수 목록, 태그 그룹, 카테고리별 항목처럼 배열 안에 배열이 저장된 데이터를 단일 배열로 변환해야 할 때 실무에서 자주 활용됩니다.