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

MongoDB에서 ObjectId 배열을 원래 값이 담긴 필드를 가진 내장 문서 배열로 변환하는 방법

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"
          }
       }
    ]
}

핵심은 $mapin 표현식에서 { Name: "$$this" }처럼 각 요소를 원하는 필드에 감싸는 것입니다. 이 패턴을 응용하면 ObjectId 배열을 { "_id": ObjectId("...") } 형태의 참조 문서 배열로 손쉽게 재구성할 수 있으며, $lookup으로 컬렉션을 조인할 때 특히 유용합니다.