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

MongoDB에서 모든 문서의 필드 이름을 한 번에 변경하는 방법 ($rename 연산자 활용)

MongoDB에서 컬렉션(collection)에 속한 모든 문서(document)의 특정 필드 이름을 일괄 변경하려면 $rename 연산자를 사용하면 됩니다. 이 연산자는 기존 필드의 값을 그대로 유지한 채 필드 이름만 새로운 이름으로 바꿔 줍니다.

기본 문법

컬렉션 내 모든 문서의 필드 이름을 변경하는 기본 문법은 다음과 같습니다.

db.yourCollectionName.update({}, {$rename:{"yourOldFieldName":"yourNewFieldName"}},
false, true);

각 인자의 의미는 다음과 같습니다.

  • 첫 번째 인자 {} : 빈 조건(query)으로 지정하여 컬렉션의 모든 문서를 대상으로 합니다.
  • 세 번째 인자 false : upsert 옵션을 비활성화합니다. 조건에 맞는 문서가 없어도 새 문서를 생성하지 않습니다.
  • 네 번째 인자 true : multi 옵션을 활성화합니다. 이 값이 true여야 조건에 맞는 모든 문서에 업데이트가 적용됩니다.

예제용 컬렉션 생성하기

개념을 이해하기 위해 먼저 샘플 문서가 담긴 컬렉션을 만들어 보겠습니다. 아래 쿼리는 renameFieldDemo 컬렉션에 학생 이름 데이터를 순차적으로 삽입합니다.

> db.renameFieldDemo.insertOne({"StudentName":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7ee6c7559dd2396bcfbfbb")
}
> db.renameFieldDemo.insertOne({"StudentName":"Carol"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7ee6cb559dd2396bcfbfbc")
}
> db.renameFieldDemo.insertOne({"StudentName":"Bob"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7ee6cf559dd2396bcfbfbd")
}
> db.renameFieldDemo.insertOne({"StudentName":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7ee6d3559dd2396bcfbfbe")
}
> db.renameFieldDemo.insertOne({"StudentName":"Maxwell"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7ee6d8559dd2396bcfbfbf")
}

삽입된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

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

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

{ "_id" : ObjectId("5c7ee6c7559dd2396bcfbfbb"), "StudentName" : "John" }
{ "_id" : ObjectId("5c7ee6cb559dd2396bcfbfbc"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5c7ee6cf559dd2396bcfbfbd"), "StudentName" : "Bob" }
{ "_id" : ObjectId("5c7ee6d3559dd2396bcfbfbe"), "StudentName" : "David" }
{ "_id" : ObjectId("5c7ee6d8559dd2396bcfbfbf"), "StudentName" : "Maxwell" }

$rename으로 필드 이름 변경하기

이제 모든 문서의 StudentName 필드를 StudentFirstName으로 변경해 보겠습니다.

> db.renameFieldDemo.update({}, {$rename:{"StudentName":"StudentFirstName"}}, false,
true);
WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 5 })

실행 결과를 보면 nMatched : 5, nModified : 5로 표시되는데, 이는 총 5개의 문서가 조건과 일치했고 5개 모두 성공적으로 수정되었음을 의미합니다.

변경 결과 확인하기

다시 전체 문서를 조회하여 필드 이름이 제대로 변경되었는지 확인해 보겠습니다.

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

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

{ "_id" : ObjectId("5c7ee6c7559dd2396bcfbfbb"), "StudentFirstName" : "John" }
{
   "_id" : ObjectId("5c7ee6cb559dd2396bcfbfbc"),
   "StudentFirstName" : "Carol"
}
{ "_id" : ObjectId("5c7ee6cf559dd2396bcfbfbd"), "StudentFirstName" : "Bob" }
{
   "_id" : ObjectId("5c7ee6d3559dd2396bcfbfbe"),
   "StudentFirstName" : "David"
}
{
   "_id" : ObjectId("5c7ee6d8559dd2396bcfbfbf"),
   "StudentFirstName" : "Maxwell"
}

출력 결과에서 확인할 수 있듯이, 모든 문서의 StudentName 필드가 StudentFirstName으로 성공적으로 변경되었습니다. 필드 값은 그대로 유지됩니다.

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

위 예제에서 사용한 update() 메서드는 구버전 방식입니다. MongoDB 3.x 이상 버전에서는 여러 문서를 한 번에 수정할 때 updateMany() 메서드를 사용하는 것이 공식적으로 권장됩니다. 동일한 작업을 updateMany()로 수행하면 multi 옵션을 별도로 지정할 필요가 없습니다.

> db.renameFieldDemo.updateMany({}, {$rename:{"StudentName":"StudentFirstName"}});
{ "acknowledged" : true, "matchedCount" : 5, "modifiedCount" : 5 }

결과 응답에서 matchedCountmodifiedCount를 통해 몇 개의 문서가 처리되었는지 명확하게 확인할 수 있습니다.