MongoDB에서 배열(array)에 포함된 문서, 즉 내장 문서(embedded document)에 새로운 필드를 추가해야 하는 경우가 종종 있습니다. 이럴 때는 update() 메서드와 위치 연산자인 $를 함께 사용하면 간단하게 해결할 수 있습니다.
이 글에서는 실제 예제를 통해 배열 안의 특정 문서에 필드를 추가하는 전체 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 컬렉션을 생성하고 문서를 삽입합니다. 아래 예제에서는 클라이언트 정보를 담은 문서를 만들고, 그 안에 프로젝트 정보를 포함하는 배열을 넣었습니다.
> db.addAFieldDemo.insertOne(
... {
... "ClientName" : "Larry",
... "ClientCountryName" : "US",
... "ClientOtherDetails" : [
... {
... "ClientProjectName":"Online Banking System"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd44bdc2cba06f46efe9ee8")
}2단계: 저장된 문서 확인
문서가 정상적으로 삽입되었는지 확인하려면 find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.addAFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd44bdc2cba06f46efe9ee8"),
"ClientName" : "Larry",
"ClientCountryName" : "US",
"ClientOtherDetails" : [
{
"ClientProjectName" : "Online Banking System"
}
]
}현재 ClientOtherDetails 배열 안의 문서에는 ClientProjectName 필드만 존재합니다.
3단계: 배열 내 문서에 필드 추가
이제 핵심 단계입니다. $elemMatch 연산자로 조건에 맞는 배열 요소를 찾은 뒤, $set 연산자와 $ 위치 연산자를 조합하여 해당 내장 문서에 새로운 필드를 추가합니다.
> db.addAFieldDemo.update({ClientOtherDetails:{$elemMatch:{"ClientProjectName" : "Online Banking System"}}},
... {$set :{'ClientOtherDetails.$.isMarried':true}},true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 'ClientOtherDetails.$.isMarried' 표기법이 핵심입니다. $는 조건($elemMatch)과 일치한 배열 요소의 위치를 가리키므로, 정확히 해당 문서에만 isMarried 필드가 추가됩니다.
4단계: 최종 결과 확인
필드가 제대로 추가되었는지 다시 한번 전체 문서를 조회해 보겠습니다.
> db.addAFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd44bdc2cba06f46efe9ee8"),
"ClientName" : "Larry",
"ClientCountryName" : "US",
"ClientOtherDetails" : [
{
"ClientProjectName" : "Online Banking System",
"isMarried" : true
}
]
}출력 결과를 보면 ClientOtherDetails 배열 내부의 문서에 isMarried : true 필드가 성공적으로 추가된 것을 확인할 수 있습니다.
정리
MongoDB에서 배열에 포함된 문서에 필드를 추가하는 방법을 정리하면 다음과 같습니다.
- update() + $set: 새로운 필드를 추가하거나 기존 필드 값을 수정할 때 사용합니다.
- $elemMatch: 배열 내에서 특정 조건과 일치하는 문서를 찾을 때 사용합니다.
- $ 위치 연산자: 조건과 일치한 배열 요소의 위치를 참조하여, 해당 요소에만 업데이트를 적용합니다.
참고로 최신 버전의 MongoDB에서는 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다. 동작 원리는 동일하며, 위 예제의 쿼리 구조를 그대로 활용할 수 있습니다.