MongoDB에서 배열 형태로 저장된 하위 문서(sub-document)에 새로운 필드를 추가하려면 update() 메서드와 $set 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성하기
먼저 테스트용으로 사용할 컬렉션을 만들고 문서를 삽입합니다. 아래 예제는 사용자 정보와 함께 두 개의 하위 문서를 배열로 포함하고 있습니다.
> db.addExtraFieldDemo.insertOne(
{
"_id": 1,
"UserName": "Larry",
"UserOtherDetails": [
{
"UserCountryName": "US",
"UserAge": 23
},
{
"UserCountryName": "UK",
"UserAge": 24
}
]
}
);
{ "acknowledged" : true, "insertedId" : 1 }2단계: find()로 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.addExtraFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"UserName" : "Larry",
"UserOtherDetails" : [
{
"UserCountryName" : "US",
"UserAge" : 23
},
{
"UserCountryName" : "UK",
"UserAge" : 24
}
]
}3단계: 하위 문서에 필드 추가하기
핵심은 $set 연산자와 배열 인덱스 위치 지정입니다. 경로를 "필드명.인덱스.새필드명" 형식으로 작성하면 해당 위치의 하위 문서에만 필드가 추가됩니다.
예를 들어 첫 번째 하위 문서(UserOtherDetails의 0번 인덱스)에 isMarried_ 필드를 추가하는 쿼리는 다음과 같습니다.
> db.addExtraFieldDemo.update({ "_id": 1 }, { "$set": { "UserOtherDetails.0.isMarried_" : true } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과를 보면 nMatched가 1, nModified가 1로 표시되는데, 이는 조건에 일치한 문서 1개가 성공적으로 수정되었음을 의미합니다.
4단계: 변경 결과 확인하기
다시 한번 find() 메서드로 문서를 조회해 보겠습니다.
> db.addExtraFieldDemo.find().pretty();
첫 번째 하위 문서에만 isMarried_ 필드가 true 값으로 추가된 것을 확인할 수 있습니다.
{
"_id" : 1,
"UserName" : "Larry",
"UserOtherDetails" : [
{
"UserCountryName" : "US",
"UserAge" : 23,
"isMarried_" : true
},
{
"UserCountryName" : "UK",
"UserAge" : 24
}
]
}추가 팁
- 특정 요소 지정: UserOtherDetails.0처럼 인덱스 번호를 바꾸면 원하는 위치의 하위 문서에 필드를 추가할 수 있습니다. (0부터 시작)
- 최신 버전 권장 문법: MongoDB 4.2 이상에서는 update() 대신 updateOne(), updateMany() 사용이 권장됩니다. 동작 방식은 동일합니다.
- 조건 기반 업데이트: 배열 내 특정 값을 가진 요소를 찾아 수정하려면 positional 연산자($)를 활용할 수도 있습니다.