MongoDB에서 중첩 문서 업데이트하기
MongoDB에서 중첩(nested)되어 있는 문서의 특정 필드를 수정하려면 update() 메서드를 사용하고, 그 안에서 점 표기법(dot notation)을 활용하면 됩니다. 점 표기법은 상위 필드와 하위 필드를 마침표(.)로 연결하여 내부에 위치한 값에 직접 접근할 수 있게 해주는 방식입니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 하나 삽입해 보겠습니다.
> db.demo607.insertOne(
{
id: 1,
"Info1": {
"Name": "Chris",
"Age": 21,
"Info2": {
"SubjectName": "MongoDB",
"Marks": 89
}
}
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9742a5f57d0dc0b182d62a")
}위 문서는 Info1 객체 안에 다시 Info2 객체가 포함된 이중으로 중첩된 구조입니다. 즉, 최대 두 단계 깊이까지 중첩된 문서입니다.
2. 현재 데이터 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo607.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e9742a5f57d0dc0b182d62a"), "id" : 1, "Info1" :
{ "Name" : "Chris", "Age" : 21, "Info2" : { "SubjectName" : "MongoDB", "Marks" : 89 } }
}현재 Marks 값은 89로 저장되어 있습니다.
3. 중첩 문서 업데이트 쿼리 실행
이제 중첩된 문서를 업데이트하는 핵심 쿼리입니다. 조건으로 {id: 1}을 지정하고, $set 연산자와 함께 점 표기법 "Info1.Info2.Marks"를 사용하여 값을 변경합니다.
> db.demo607.update({id:1},{$set:{"Info1.Info2.Marks":90}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과 메시지를 보면 nMatched: 1(조건에 일치한 문서 1개), nModified: 1(실제로 수정된 문서 1개)로 표시되며, 정상적으로 업데이트가 완료되었음을 알 수 있습니다.
4. 업데이트 결과 확인
find() 메서드와 pretty()를 함께 사용하여 결과를 보기 좋게 출력해 확인합니다.
> db.demo607.find().pretty();
출력 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e9742a5f57d0dc0b182d62a"),
"id" : 1,
"Info1" : {
"Name" : "Chris",
"Age" : 21,
"Info2" : {
"SubjectName" : "MongoDB",
"Marks" : 90
}
}
}Marks 값이 기존의 89에서 90으로 성공적으로 변경된 것을 확인할 수 있습니다.
정리
MongoDB에서 중첩 문서를 업데이트할 때는 다음 사항을 기억하세요.
update()메서드(또는 MongoDB 4.2 이상에서 권장되는updateOne(),updateMany())를 사용합니다.- 수정하려는 하위 필드까지 경로를 점 표기법으로 명확히 지정해야 합니다. 예:
"Info1.Info2.Marks" $set연산자를 사용하면 해당 필드만 정확히 변경되고, 문서의 나머지 구조에는 영향을 주지 않습니다.
참고로 따옴표 없이 Info1.Info2.Marks처럼 작성해도 동작하지만, 필드 이름에 공백이나 특수문자가 포함된 경우를 대비해 따옴표로 감싸는 것이 더 안전한 습관입니다.