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

MongoDB 중첩 배열(Nested Array)에서 값을 찾고 수정하는 방법

MongoDB 중첩 배열에서 값 찾기 및 수정하기

MongoDB에서 문서 내부에 포함된 중첩 배열(nested array)의 특정 값을 찾아 수정하려면 update 명령어와 함께 $elemMatch 연산자 및 위치 연산자($)를 사용하면 됩니다.

이 글에서는 실제 예제를 통해 중첩 배열 안에 있는 필드 값을 조회하고 변경하는 전체 과정을 단계별로 살펴보겠습니다.

1단계: 테스트용 컬렉션 생성

먼저 회사 정보와 개발 프로젝트 목록(중첩 배열)을 포함하는 컬렉션을 생성합니다.

> db.findAndModifyAValueInNestedArrayDemo.insertOne({
   "CompanyName": "Amazon",
   "DeveloperDetails": [
      { "ProjectName": "Online Book Store", "TeamSize": "5" },
      { "ProjectName": "Library Management System", "TeamSize": "7" },
      { "ProjectName": "Online Banking Application", "TeamSize": "15" }
   ]
});
{
   "acknowledged": true,
   "insertedId": ObjectId("5ca275226304881c5ce84b9f")
}

2단계: 저장된 문서 확인

find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회합니다.

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

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

{
   "_id": ObjectId("5ca275226304881c5ce84b9f"),
   "CompanyName": "Amazon",
   "DeveloperDetails": [
      {
         "ProjectName": "Online Book Store",
         "TeamSize": "5"
      },
      {
         "ProjectName": "Library Management System",
         "TeamSize": "7"
      },
      {
         "ProjectName": "Online Banking Application",
         "TeamSize": "15"
      }
   ]
}

3단계: 중첩 배열의 값 수정하기

이제 $elemMatch를 사용해 조건에 맞는 배열 요소를 찾고, 위치 연산자($)를 이용해 해당 요소의 TeamSize 값을 20으로 변경해 보겠습니다. 수정 대상은 ProjectName이 "Online Banking Application"인 항목입니다.

> db.findAndModifyAValueInNestedArrayDemo.update(
   { DeveloperDetails: { $elemMatch: { ProjectName: "Online Banking Application" } } },
   { $set: { 'DeveloperDetails.$.TeamSize': '20' } }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

실행 결과 nModified: 1이 반환되었으므로, 정확히 하나의 문서가 성공적으로 수정되었습니다.

핵심 포인트:

  • $elemMatch: 배열 내에서 지정한 조건과 일치하는 요소를 매칭할 때 사용합니다.
  • $(위치 연산자): 쿼리 조건과 일치한 첫 번째 배열 요소를 가리키며, 업데이트 시 해당 요소만 정확히 수정할 수 있습니다.

4단계: 수정 결과 검증

문서가 올바르게 수정되었는지 다시 한번 조회하여 확인합니다.

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

출력 결과를 보면 "Online Banking Application" 프로젝트의 TeamSize가 기존의 "15"에서 "20"으로 변경된 것을 확인할 수 있습니다.

{
   "_id": ObjectId("5ca275226304881c5ce84b9f"),
   "CompanyName": "Amazon",
   "DeveloperDetails": [
      {
         "ProjectName": "Online Book Store",
         "TeamSize": "5"
      },
      {
         "ProjectName": "Library Management System",
         "TeamSize": "7"
      },
      {
         "ProjectName": "Online Banking Application",
         "TeamSize": "20"
      }
   ]
}

마무리

이처럼 MongoDB에서는 update 명령어와 $elemMatch, 그리고 위치 연산자($)를 조합하면 복잡한 구조의 중첩 배열 속 특정 값도 간단하고 정확하게 수정할 수 있습니다. 참고로 최신 MongoDB 버전에서는 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다.