MongoDB 컬렉션의 필드 이름을 변경하거나 다시 매핑(re-mapping)해야 하는 경우가 종종 있습니다. 예를 들어 기존 스키마 설계를 수정하거나 필드명을 더 직관적으로 바꾸고 싶을 때가 그렇습니다. 이럴 때 update() 메서드와 $rename 연산자를 함께 사용하면 간단하게 해결할 수 있습니다.
1. 테스트용 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.demo171.insertOne({ "Name": "Chris", "Details": { "SubjectName": "MySQL", "CountryName": "US" } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3837399e4f06af551997e0")
}2. 현재 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo171.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e3837399e4f06af551997e0"), "Name" : "Chris", "Details" : { "SubjectName" : "MySQL", "CountryName" : "US" } }현재 Name이라는 최상위 필드가 존재하는 것을 확인할 수 있습니다.
3. $rename 연산자로 필드 재매핑하기
다음은 $rename 연산자를 사용하여 MongoDB 컬렉션의 필드를 다시 매핑하는 쿼리입니다. 여기서는 Name 필드를 StudentName으로 변경합니다.
> db.demo171.update({}, { $rename : { 'Name' : 'StudentName' } }, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리에 사용된 인자는 다음과 같은 의미를 가집니다.
- 첫 번째 인자
{}: 모든 문서를 대상으로 업데이트를 수행하는 빈 조건입니다. - 세 번째 인자
false: 조건에 맞는 문서가 없어도 새로 삽입(upsert)하지 않도록 설정합니다. - 네 번째 인자
true: 조건에 일치하는 모든 문서(multi)에 대해 업데이트를 적용합니다.
참고: 최신 MongoDB 버전에서는
updateMany({}, { $rename: { 'Name': 'StudentName' } })처럼updateMany()를 사용하는 것이 권장됩니다. 동작 방식은 동일하며 코드가 더 명확해집니다.
4. 변경된 결과 확인하기
다시 find() 메서드로 컬렉션의 모든 문서를 조회하여 변경 사항을 확인합니다.
> db.demo171.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e3837399e4f06af551997e0"), "Details" : { "SubjectName" : "MySQL", "CountryName" : "US" }, "StudentName" : "Chris" }출력 결과를 보면 기존의 Name 필드가 사라지고, 동일한 값("Chris")을 가진 StudentName 필드로 성공적으로 이름이 변경된 것을 확인할 수 있습니다. 중첩된 Details 객체 내부의 필드들은 영향을 받지 않고 그대로 유지됩니다.
정리
MongoDB에서 필드 이름을 일괄 변경할 때는 update()(또는 updateMany())와 $rename 연산자를 조합하면 됩니다. 이 방식은 데이터 값은 그대로 보존하면서 필드 키만 변경하기 때문에 스키마 마이그레이션 작업 시 매우 유용합니다.