Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 하위 객체(내장 도큐먼트) 업데이트하는 방법 – $set 연산자 활용 가이드

MongoDB에서 하위 객체(내장 도큐먼트)의 특정 필드를 수정하거나 새로 추가할 때는 $set 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 하위 객체를 업데이트하는 전체 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 문서 하나가 포함된 컬렉션을 생성합니다. ClientDetails라는 하위 객체 안에 ClientFirstName 필드가 있는 구조입니다.

> db.updateSubObjectDemo.insertOne(
...    {
...       "ClientId" : 100,
...       "ClientDetails" : {
...          "ClientFirstName" : "Adam"
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd31434b64f4b851c3a13e9")
}

2. 저장된 문서 확인하기

find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 읽기 좋은 형태로 출력할 수 있습니다.

> db.updateSubObjectDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cd31434b64f4b851c3a13e9"),
   "ClientId" : 100,
   "ClientDetails" : {
      "ClientFirstName" : "Adam"
   }
}

3. $set 연산자로 하위 객체 업데이트하기

핵심은 점 표기법(dot notation)입니다. 상위 필드명과 하위 필드명을 마침표(.)로 연결한 경로를 지정하고, $set 연산자로 값을 설정하면 해당 하위 필드만 정확히 수정됩니다. 아래 예제에서는 ClientDetails 객체에 ClientLastName이라는 새 필드를 추가합니다.

> db.updateSubObjectDemo.update({ClientId : 100}, { $set : { "ClientDetails.ClientLastName" : "Smith"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

결과 메시지에서 nMatched : 1은 조건에 일치하는 문서가 1개 있다는 뜻이고, nModified : 1은 실제로 1개의 문서가 변경되었음을 의미합니다.

4. 업데이트 결과 확인하기

다시 find() 메서드로 전체 문서를 조회해 보겠습니다.

> db.updateSubObjectDemo.find().pretty();

ClientLastName이 정상적으로 추가된 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5cd31434b64f4b851c3a13e9"),
   "ClientId" : 100,
   "ClientDetails" : {
      "ClientFirstName" : "Adam",
      "ClientLastName" : "Smith"
   }
}

추가 팁: 최신 MongoDB 버전에서는 updateOne() 권장

예제에 사용된 update() 메서드는 구버전 방식이며, 현재는 deprecated(사용 중단 권고) 상태입니다. 최신 버전의 MongoDB에서는 동일한 작업을 updateOne() 또는 updateMany()로 수행하는 것이 좋습니다.

> db.updateSubObjectDemo.updateOne(
...    { ClientId : 100 },
...    { $set : { "ClientDetails.ClientLastName" : "Smith" } }
... );


정리하면, MongoDB에서 하위 객체를 업데이트할 때는 점 표기법으로 경로를 지정하고 $set 연산자를 사용하면 됩니다. 이 방식은 기존 하위 객체 전체를 덮어쓰지 않고 필요한 필드만 안전하게 추가하거나 수정할 수 있어 매우 유용합니다.