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
}현재 각 문서에는 ClientName과 ClientAge 필드만 존재합니다.
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)을 활용하면 중첩된 하위 필드도 손쉽게 추가할 수 있습니다.