MongoDB에서 특정 문서 업데이트하기
MongoDB에서 컬렉션 내의 특정 문서를 업데이트하려면 $set 연산자와 함께 update() 메서드를 사용해야 합니다. 이 글에서는 배열 형태로 저장된 문서 중 특정 요소만 선택적으로 수정하는 방법을 단계별로 살펴보겠습니다.
1단계: 테스트용 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.demo135.insertOne({"Details":[{"EmployeeId":101,"EmployeeName":"Chris","EmployeeSalary":45000},{"EmployeeId":102,"EmployeeName":"Chris","EmployeeSalary":45000}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31a5ddfdf09dd6d085399c")
}위 쿼리는 직원 정보 두 건을 Details 배열에 담아 하나의 문서로 삽입합니다. 두 직원 모두 이름이 "Chris"이지만, 직원 ID(101, 102)로 구분됩니다.
2단계: 삽입된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo135.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e31a5ddfdf09dd6d085399c"),
"Details" : [
{
"EmployeeId" : 101,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
},
{
"EmployeeId" : 102,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
}
]
}3단계: 위치 연산자($)를 활용한 업데이트 쿼리 실행
이제 두 번째 직원(EmployeeId: 102)의 이름을 "John Doe"로 변경해 보겠습니다. 핵심은 위치 연산자($)입니다. 조건절에서 매칭된 배열 요소의 위치를 가리켜 해당 요소만 정확히 수정할 수 있습니다.
> db.demo135.update(
... {
... "Details.EmployeeId":102,
... },
... {
... $set: {
... "Details.$.EmployeeName" : "John Doe"
... }
... }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 구조를 살펴보면 다음과 같습니다.
- 조건부:
"Details.EmployeeId": 102— EmployeeId가 102인 배열 요소를 찾습니다. - 업데이트부:
$set과 함께"Details.$.EmployeeName"을 지정합니다. 여기서$는 조건에 매칭된 첫 번째 배열 요소를 의미합니다.
실행 결과 nMatched: 1, nModified: 1이 반환되었으므로, 하나의 문서가 성공적으로 수정되었습니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인합니다.
> db.demo135.find().pretty();
최종 출력 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e31a5ddfdf09dd6d085399c"),
"Details" : [
{
"EmployeeId" : 101,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
},
{
"EmployeeId" : 102,
"EmployeeName" : "John Doe",
"EmployeeSalary" : 45000
}
]
}출력 결과를 보면 EmployeeId가 102인 직원의 이름만 "Chris"에서 "John Doe"로 변경되었고, 나머지 데이터는 그대로 유지된 것을 확인할 수 있습니다.
정리
MongoDB에서 배열 내 특정 요소를 업데이트할 때는 다음 사항을 기억하세요.
update()메서드와$set연산자를 함께 사용합니다.- 배열 내 특정 요소를 지정하려면 위치 연산자($)를 활용합니다.
- 위치 연산자는 반드시 조건절에 배열 필드에 대한 매칭 조건이 있어야 동작합니다.
- 참고로 최신 MongoDB 버전에서는
updateOne(),updateMany()사용이 권장되며,update()는 deprecated 상태입니다.