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 }결과 응답에서 matchedCount와 modifiedCount를 통해 몇 개의 문서가 처리되었는지 명확하게 확인할 수 있습니다.