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() 메서드를 사용하는 것이 권장됩니다.