MongoDB에서 배열 내부의 요소를 업데이트하려면 $addToSet 연산자를 사용할 수 있습니다. $addToSet은 배열에 값을 추가하되, 동일한 값이 이미 존재하지 않는 경우에만 추가해 주는 연산자입니다. 이 글에서는 실제 예제를 통해 배열 요소를 업데이트하는 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.updateArrayDemo.insertOne(
... {
... "ClientDetails" : [
... {
... "ClientName" : "John",
... "DeveloperDetails" : [ ]
... },
... {
... "ClientName" : "Larry",
... "DeveloperDetails" : [ ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf465edceb9a92e6aa1960")
}위 명령은 두 개의 클라이언트 정보(John과 Larry)를 담고 있는 ClientDetails 배열을 가진 문서 하나를 생성합니다.
2. find()로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.updateArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ccf465edceb9a92e6aa1960"),
"ClientDetails" : [
{
"ClientName" : "John",
"DeveloperDetails" : [ ]
},
{
"ClientName" : "Larry",
"DeveloperDetails" : [ ]
}
]
}3. $addToSet으로 배열 요소 업데이트하기
이제 $addToSet 연산자와 위치 연산자($)를 함께 사용하여 특정 조건에 일치하는 배열 요소를 업데이트해 보겠습니다. 아래 쿼리는 ClientName이 "Larry"인 항목을 찾아 해당 요소에 Technology 필드를 추가합니다.
> db.updateArrayDemo.update({ "ClientDetails.ClientName": "Larry" },
{ $addToSet: { "ClientDetails.$.Technology": { 'DeveloperName': "Chris", 'WorkExperience':5 } } }, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 실행 결과 nModified : 1이 반환되었으므로, 한 개의 문서가 성공적으로 수정되었음을 알 수 있습니다. 여기서 마지막 두 인자는 각각 upsert(false)와 multi(true) 옵션을 의미합니다.
4. 업데이트 결과 확인하기
배열 요소가 실제로 업데이트되었는지 다시 한번 find() 메서드로 확인해 보겠습니다.
> db.updateArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ccf465edceb9a92e6aa1960"),
"ClientDetails" : [
{
"ClientName" : "John",
"DeveloperDetails" : [ ]
},
{
"ClientName" : "Larry",
"DeveloperDetails" : [ ],
"Technology" : [
{
"DeveloperName" : "Chris",
"WorkExperience" : 5
}
]
}
]
}마무리
출력 결과를 보면 Larry의 배열 요소 안에 Technology 필드가 새롭게 추가되고, 그 안에 개발자 이름(Chris)과 경력(5년) 정보가 저장된 것을 확인할 수 있습니다. 이처럼 MongoDB에서는 $addToSet 연산자와 위치 연산자($)를 조합하여 중첩된 배열 구조의 요소를 손쉽게 업데이트할 수 있습니다. 참고로 최신 버전의 MongoDB에서는 updateOne(), updateMany() 같은 메서드 사용이 권장되므로, 실무 환경에서는 이를 활용하는 것이 좋습니다.