MongoDB에서 _id 필드는 직접 수정할 수 없습니다
MongoDB에서 _id 필드는 불변(immutable) 속성을 가지기 때문에 update 연산으로 직접 수정하는 것은 불가능합니다. 하지만 새로운 _id를 가진 문서를 저장한 후 기존 문서를 삭제하는 방식으로 사실상 _id를 변경할 수 있습니다.
아래의 4단계 절차를 따라 하면 MongoDB 문서의 _id를 성공적으로 변경할 수 있습니다.
1단계: 기존 ObjectId를 변수에 저장
먼저 변경하려는 문서를 findOne() 메서드로 조회하여 변수에 담습니다.
anyVariableName = db.yourCollectionName.findOne({_id: yourObjectIdValue});2단계: 변수에 새로운 _id 값 할당
조회해 온 문서 객체의 _id 필드에 새로운 ObjectId 값을 설정합니다.
yourDeclaredVariableName._id = yourNewObjectIdValue;
3단계: 새로운 _id를 가진 문서 삽입
변경된 _id가 적용된 문서를 컬렉션에 다시 삽입합니다.
db.yourCollectionName.insert(yourDeclaredVariableName);
4단계: 기존 _id의 문서 삭제
마지막으로 예전 _id를 가진 원본 문서를 제거하면 전체 과정이 완료됩니다.
db.yourCollectionName.remove({_id: yourOldObjectIdValue});실전 예제로 확인하기
위 단계를 실제로 이해하기 위해 샘플 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
테스트 컬렉션 생성 및 데이터 삽입
> db.updateIdDemo.insertOne({"StudentName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ebfec6fd07954a4890683")
}
> db.updateIdDemo.insertOne({"StudentName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ebff66fd07954a4890684")
}
> db.updateIdDemo.insertOne({"StudentName":"Maxwell"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ebfff6fd07954a4890685")
}find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.updateIdDemo.find().pretty();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c6ebfec6fd07954a4890683"), "StudentName" : "Robert" }
{ "_id" : ObjectId("5c6ebff66fd07954a4890684"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5c6ebfff6fd07954a4890685"), "StudentName" : "Maxwell" }_id 변경 쿼리 실행
이제 앞서 설명한 4단계를 순서대로 실행하여 Robert 학생 문서의 _id를 변경해 보겠습니다.
Step 1:
> myId = db.updateIdDemo.findOne({_id: ObjectId("5c6ebfec6fd07954a4890683")});
{ "_id" : ObjectId("5c6ebfec6fd07954a4890683"), "StudentName" : "Robert" }
Step 2:
> myId._id = ObjectId("5c6ebfec6fd07954a4890689");
ObjectId("5c6ebfec6fd07954a4890689")
Step 3:
> db.updateIdDemo.insert(myId);
WriteResult({ "nInserted" : 1 })
Step 4:
> db.updateIdDemo.remove({_id: ObjectId("5c6ebfec6fd07954a4890683")});
WriteResult({ "nRemoved" : 1 })변경 결과 확인
_id가 정상적으로 업데이트되었는지 다시 한번 find() 메서드로 전체 문서를 조회합니다.
> db.updateIdDemo.find().pretty();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c6ebff66fd07954a4890684"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5c6ebfff6fd07954a4890685"), "StudentName" : "Maxwell" }
{ "_id" : ObjectId("5c6ebfec6fd07954a4890689"), "StudentName" : "Robert" }출력 결과를 보면 "StudentName": "Robert" 문서의 _id가 5c6ebfec6fd07954a4890683에서 5c6ebfec6fd07954a4890689로 성공적으로 변경된 것을 확인할 수 있습니다.
주의사항
이 방식은 문서를 삭제 후 재삽입하는 방식이므로, 운영 환경에서는 다음 사항을 반드시 고려해야 합니다.
- 해당 _id를 참조하는 외래 키나 다른 컬렉션의 참조가 있다면 함께 업데이트해야 합니다.
- 대량의 문서를 처리할 경우 트랜잭션을 사용하여 데이터 일관성을 보장하는 것이 좋습니다.
- insert와 remove 사이에 오류가 발생하면 데이터 유실이나 중복이 생길 수 있으므로 백업을 권장합니다.