MongoDB에서 기본 키(Primary Key) 역할을 하는 _id 필드는 한 번 생성되면 직접 수정할 수 없습니다. 따라서 기본 키를 변경하려면 기존 문서를 삭제한 뒤 새로운 _id가 자동으로 부여되도록 다시 삽입하는 방식을 사용해야 합니다. 이 작업은 forEach() 메서드와 함께 삭제(remove) 작업을 조합하여 손쉽게 처리할 수 있습니다.
1. 샘플 컬렉션 생성
먼저 실습에 사용할 컬렉션을 만들고 문서를 하나 삽입해 보겠습니다.
> db.demo41.insertOne({"StudentName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e25ce4acfb11e5c34d898e3")
}2. find()로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션 내 모든 문서를 확인할 수 있습니다.
> db.demo41.find();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e25ce4acfb11e5c34d898e3"), "StudentName" : "Carol" }3. 기본 키를 변경하는 쿼리 실행하기
이제 MongoDB 컬렉션의 기본 키를 변경하는 핵심 쿼리입니다. 각 문서를 순회하면서 기존 _id 값을 제거한 후 문서를 다시 삽입하고, 이전 _id를 가진 원본 문서를 삭제합니다.
> var next = db.demo41.find()
>
> next.forEach(function(s) {
... var prevId = s._id;
... delete s._id;
... db.demo41.insert(s);
... db.demo41.remove(prevId);
... });이 코드의 동작 순서는 다음과 같습니다.
find()로 컬렉션의 모든 문서를 가져옵니다.forEach()로 각 문서를 하나씩 순회합니다.- 기존
_id값을 변수에 저장한 뒤 문서 객체에서 삭제합니다. _id가 없는 상태로 문서를 다시 삽입하면 MongoDB가 새로운 ObjectId를 자동 생성합니다.- 마지막으로 이전
_id를 가진 원본 문서를 삭제합니다.
4. 변경된 기본 키 확인하기
작업이 완료되었으니 다시 한번 find() 메서드로 기본 키를 확인해 보겠습니다.
> db.demo41.find();
실행 결과, 아래와 같이 새로운 기본 키가 부여된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e25cee5cfb11e5c34d898e4"), "StudentName" : "Carol" }주의 사항
이 방식은 문서를 삭제 후 재삽입하는 구조이므로, 운영 환경에서 대량의 데이터를 처리할 때는 성능 저하나 데이터 정합성 문제가 발생할 수 있습니다. 또한 해당 컬렉션을 참조하는 외래 키나 인덱스가 있다면 함께 업데이트해야 하므로, 작업 전 반드시 백업을 권장합니다.