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

MongoDB 기존 레코드에 필드 추가하는 방법 완벽 가이드

MongoDB에서 기존 레코드에 필드를 추가하는 방법

MongoDB에서 기존 레코드(문서)에 새로운 필드를 추가하려면 update 명령어와 $set 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 컬렉션의 모든 문서에 새 필드를 일괄 추가하는 과정을 단계별로 살펴보겠습니다.

1단계: 테스트용 컬렉션 생성 및 문서 삽입

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입합니다. insertOne() 메서드를 사용하여 두 개의 클라이언트 문서를 추가해 보겠습니다.

> db.addAFieldToEveryRecordDemo.insertOne({"ClientName":"Chris","ClientAge":34});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd00e32588d4a6447b2e061")
}
> db.addAFieldToEveryRecordDemo.insertOne({"ClientName":"Robert","ClientAge":36});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd00e59588d4a6447b2e062")
}

2단계: 현재 저장된 문서 확인하기

find() 메서드와 pretty() 함수를 사용하면 컬렉션 내 모든 문서를 보기 좋게 출력할 수 있습니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd00e32588d4a6447b2e061"),
   "ClientName" : "Chris",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cd00e59588d4a6447b2e062"),
   "ClientName" : "Robert",
   "ClientAge" : 36
}

현재 각 문서에는 ClientNameClientAge 필드만 존재합니다.

3단계: $set 연산자로 모든 레코드에 새 필드 추가

이제 모든 레코드에 ClientDetails.ClientCountryName이라는 중첩 필드를 추가해 보겠습니다. 첫 번째 인자인 빈 조건({})은 모든 문서를 대상으로 한다는 의미이며, 네 번째 인자인 true(multi 옵션)는 여러 문서를 동시에 수정하도록 지정합니다.

> db.addAFieldToEveryRecordDemo.update({},{$set:{"ClientDetails.ClientCountryName":""}},true,true);
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

실행 결과를 보면 nMatched: 2, nModified: 2로 표시되어, 두 개의 문서가 모두 성공적으로 업데이트되었음을 알 수 있습니다.

4단계: 업데이트 결과 검증하기

새 필드가 실제로 잘 추가되었는지 다시 한번 전체 문서를 조회해 확인합니다.

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

출력 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cd00e32588d4a6447b2e061"),
   "ClientName" : "Chris",
   "ClientAge" : 34,
   "ClientDetails" : {
      "ClientCountryName" : ""
   }
}
{
   "_id" : ObjectId("5cd00e59588d4a6447b2e062"),
   "ClientName" : "Robert",
   "ClientAge" : 36,
   "ClientDetails" : {
      "ClientCountryName" : ""
   }
}

모든 문서에 ClientDetails 객체가 추가되고, 그 안에 빈 문자열 값으로 초기화된 ClientCountryName 필드가 포함된 것을 확인할 수 있습니다.

참고: 최신 버전에서는 updateMany() 사용 권장

MongoDB 4.2 이상 버전에서는 위에서 사용한 구식 update() 방식 대신 updateMany() 메서드를 사용하는 것이 권장됩니다. 코드가 더 간결하고 의미도 명확해집니다.

> db.addAFieldToEveryRecordDemo.updateMany(
...    {},
...    { $set: { "ClientDetails.ClientCountryName": "" } }
... );
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

updateMany()는 조건에 일치하는 모든 문서를 자동으로 업데이트하므로 별도의 multi 옵션을 지정할 필요가 없습니다.

핵심 정리

  • 기존 문서에 필드를 추가할 때는 $set 연산자를 사용합니다.
  • 첫 번째 인자를 빈 객체({})로 지정하면 컬렉션의 모든 문서가 대상이 됩니다.
  • 여러 문서를 한 번에 수정하려면 multi 옵션을 true로 설정하거나, 최신 버전에서는 updateMany()를 사용합니다.
  • $set은 존재하지 않는 필드를 자동으로 생성하며, 점 표기법(dot notation)을 활용하면 중첩된 하위 필드도 손쉽게 추가할 수 있습니다.