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