MongoDB에서 배열(리스트) 안에 있는 특정 항목 하나만 업데이트하려면 위치 연산자($)를 사용해야 합니다. 이 글에서는 실제 예제를 통해 단일 배열 요소를 업데이트하는 방법을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제로 사용할 컬렉션을 만들고 문서를 하나 삽입하겠습니다. insertOne() 메서드를 사용합니다.
> db.updateASingleListDemo.insertOne({ _id:1, "EmployeeName":"Chris", "EmployeeDetails": [{"EmployeeId":"EMP-101","EmployeeSalary": 18999 }] });
{ "acknowledged" : true, "insertedId" : 1 }위 쿼리는 직원 이름과 함께 직원 상세 정보(사번, 급여)를 배열 형태로 저장하는 문서를 생성합니다.
2. 삽입된 문서 확인
find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.updateASingleListDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"EmployeeName" : "Chris",
"EmployeeDetails" : [
{
"EmployeeId" : "EMP-101",
"EmployeeSalary" : 18999
}
]
}3. 위치 연산자($)로 단일 항목 업데이트
이제 배열 내 특정 항목만 업데이트해 보겠습니다. 여기서는 사번이 EMP-101인 직원의 급여를 $inc 연산자를 사용해 1 증가시킵니다.
핵심은 쿼리 조건에 _id와 EmployeeDetails.EmployeeId를 함께 지정하고, 업데이트 부분에서 $(위치 연산자)를 사용해 조건에 일치한 배열 요소를 가리키는 것입니다.
> db.updateASingleListDemo.update({_id: 1, 'EmployeeDetails.EmployeeId': "EMP-101"}, {$inc: {'EmployeeDetails.$.EmployeeSalary': 1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과를 보면 nMatched: 1, nModified: 1로 표시되어, 정확히 한 개의 문서에서 한 개의 필드가 성공적으로 수정되었음을 알 수 있습니다.
4. 업데이트 결과 확인
문서를 다시 조회하여 변경 사항이 제대로 반영되었는지 확인해 보겠습니다.
> db.updateASingleListDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"EmployeeName" : "Chris",
"EmployeeDetails" : [
{
"EmployeeId" : "EMP-101",
"EmployeeSalary" : 19000
}
]
}급여가 기존의 18999에서 19000으로 정상적으로 변경된 것을 확인할 수 있습니다.
정리
MongoDB에서 배열 내 특정 요소만 업데이트할 때는 다음 두 가지가 핵심입니다.
- 쿼리 조건(
find조건)에 배열 내부 필드의 값을 명시하여 대상 요소를 특정한다. - 업데이트 연산자(
$inc,$set등)와 함께 위치 연산자$를 사용해 일치한 첫 번째 배열 요소를 참조한다.
이 방식을 활용하면 배열 전체를 교체하지 않고도 원하는 항목 하나만 효율적으로 수정할 수 있습니다.