MongoDB에서 배열을 내장 문서 배열로 변환하는 방법
배열의 각 요소를 원래 값이 특정 필드에 담긴 내장 문서(embedded document)로 변환하려면 MongoDB의 집계 파이프라인(aggregate)을 활용해야 합니다. 이 글에서는 $addFields와 $map 연산자를 사용하여 ObjectId 배열이나 일반 값 배열을 원하는 문서 구조로 변환하는 과정을 단계별로 살펴봅니다.
1단계: 샘플 컬렉션 생성
먼저 실습에 사용할 문서가 담긴 컬렉션을 생성합니다.
> db.demo343.insertOne({
... _id: 101,
... UserName: "Chris",
... details: [
... {"Name":"John"},
... {"Name":"David"}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
2단계: 기존 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo343.find().pretty();
위 명령은 다음과 같은 결과를 출력합니다.
{
"_id" : 101,
"UserName" : "Chris",
"details" : [
{
"Name" : "John"
},
{
"Name" : "David"
}
]
}
3단계: 배열을 내장 문서 배열로 변환
다음은 배열을 원래 배열 요소 값이 포함된 필드가 있는 내장 문서 배열로 변환하는 쿼리입니다.
> db.demo343.aggregate([
... {
... $addFields: {
... details: {
... $map: {
... input: "$details",
... in: { Name: "$$this" }
... }
... }
... }
... },
... { $out: "demo343" }
... ])
주요 연산자 정리
- $addFields: 기존 문서에 새 필드를 추가하거나 기존 필드의 값을 대체합니다.
- $map: 입력 배열의 각 요소에 표현식을 적용한 결과로 새로운 배열을 만듭니다.
- $$this: $map 내부에서 현재 순회 중인 배열 요소를 가리키는 변수입니다.
- $out: 집계 결과 전체를 지정한 컬렉션에 저장(기존 내용 덮어쓰기)합니다.
4단계: 변환 결과 확인
다시 find() 메서드를 실행하여 변환된 문서를 확인합니다.
> db.demo343.find().pretty();
변환이 완료된 후의 출력 결과는 다음과 같습니다.
{
"_id" : 101,
"UserName" : "Chris",
"details" : [
{
"Name" : {
"Name" : "John"
}
},
{
"Name" : {
"Name" : "David"
}
}
]
}
핵심은 $map의 in 표현식에서 { Name: "$$this" }처럼 각 요소를 원하는 필드에 감싸는 것입니다. 이 패턴을 응용하면 ObjectId 배열을 { "_id": ObjectId("...") } 형태의 참조 문서 배열로 손쉽게 재구성할 수 있으며, $lookup으로 컬렉션을 조인할 때 특히 유용합니다.