MongoDB에서 배열 내부의 문서 중 다른 키의 값이 특정 값과 일치하는 요소를 찾아 그 안의 키 값을 업데이트하려면 $elemMatch 연산자와 $set 연산자를 함께 사용하면 됩니다. $elemMatch는 배열 안에서 조건에 맞는 요소를 정확히 찾아주고, 위치 연산자($)와 결합하면 일치한 해당 요소의 필드만 선택적으로 수정할 수 있습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.keyValueDemo.insertOne(
{
"_id" : new ObjectId(),
"CustomerDetails" : [
{
"Name" : "Chris",
"Age" : 24,
},
{
"Name" : "Robert",
"Age" : 29,
},
{
"Name" : "David",
"Age" : 35,
}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefcf36ef71edecf6a1f6bf")
}위 컬렉션에는 고객 정보(CustomerDetails)가 배열 형태로 저장되어 있으며, 각 요소는 이름(Name)과 나이(Age) 필드를 가지고 있습니다.
2. find() 메서드로 전체 문서 조회하기
find() 메서드와 pretty()를 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.keyValueDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5cefcf36ef71edecf6a1f6bf"),
"CustomerDetails" : [
{
"Name" : "Chris",
"Age" : 24
},
{
"Name" : "Robert",
"Age" : 29
},
{
"Name" : "David",
"Age" : 35
}
]
}3. 조건에 맞는 요소의 키 값 업데이트하기
이제 핵심 부분입니다. 아래 쿼리는 CustomerDetails 배열 안에서 Name이 "David"인 요소를 $elemMatch로 찾은 뒤, 위치 연산자($)를 이용해 해당 요소의 Age 값을 56으로 업데이트합니다.
> db.keyValueDemo.update(
{"CustomerDetails":{"$elemMatch":{"Name":"David"}}},
{"$set":{"CustomerDetails.$.Age":56}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }
)실행 결과 nModified가 1로 표시되며, 이는 하나의 문서가 성공적으로 수정되었음을 의미합니다. 여기서 $는 $elemMatch 조건과 일치한 배열 요소의 위치를 가리키는 자리표시자 역할을 합니다.
4. 업데이트 결과 확인하기
문서를 다시 한번 조회해서 변경 사항이 제대로 반영되었는지 확인해 보겠습니다.
> db.keyValueDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5cefcf36ef71edecf6a1f6bf"),
"CustomerDetails" : [
{
"Name" : "Chris",
"Age" : 24
},
{
"Name" : "Robert",
"Age" : 29
},
{
"Name" : "David",
"Age" : 56
}
]
}출력 결과를 보면 David의 Age가 기존의 35에서 56으로 변경된 것을 확인할 수 있습니다. 이처럼 $elemMatch와 $set, 그리고 위치 연산자($)를 조합하면 배열 내 여러 요소 중 조건에 맞는 특정 요소의 필드 값만 안전하고 정확하게 업데이트할 수 있습니다.