MongoDB에서 값의 ObjectId 캐스트 실패 오류 해결하기
MongoDB에서 _id 필드가 문자열(String) 형태로 저장되어 있을 때, 이를 ObjectId 타입으로 변환하려면 aggregate() 메서드를 사용해야 합니다. 이 글에서는 문자열로 저장된 ID를 실제 ObjectId로 변환하는 과정을 단계별로 살펴보겠습니다.
1. 문서가 포함된 컬렉션 생성
먼저 문자열 형태의 _id를 가진 문서를 삽입하여 컬렉션을 생성합니다.
> db.demo460.insertOne({"_id":"5ab9cbfa31c2ab715d42129e"});
{ "acknowledged" : true, "insertedId" : "5ab9cbfa31c2ab715d42129e" }위 코드에서 _id 값은 따옴표로 감싸진 문자열로 저장되었습니다. 일반적으로 MongoDB는 _id를 자동으로 ObjectId 타입으로 생성하지만, 외부 데이터를 가져오거나 직접 문자열을 지정하면 문자열 타입으로 저장될 수 있습니다.
2. find() 메서드로 전체 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo460.find();
실행 결과는 다음과 같습니다.
{ "_id" : "5ab9cbfa31c2ab715d42129e" }출력 결과에서 _id가 따옴표 없이 표시되지 않는 것을 통해 해당 값이 ObjectId가 아닌 문자열 타입임을 확인할 수 있습니다.
3. aggregate()를 사용한 ObjectId 변환
문자열로 저장된 _id를 ObjectId로 캐스트하려면 다음과 같이 aggregate() 쿼리를 실행합니다.
> db.demo460.aggregate( [ idConvert ])
여기서 idConvert는 문자열을 ObjectId로 변환하는 파이프라인 단계입니다. 실행 결과는 다음과 같습니다.
{ "_id" : "5ab9cbfa31c2ab715d42129e", "value" : ObjectId("5ab9cbfa31c2ab715d42129e") }출력 결과에서 value 필드에 원본 문자열과 동일한 값을 가진 ObjectId("5ab9cbfa31c2ab715d42129e")가 성공적으로 생성된 것을 확인할 수 있습니다.
정리
MongoDB에서 "ObjectId로 캐스트 실패(Failed to cast to ObjectId)" 오류는 주로 문자열 형태의 ID를 ObjectId 타입의 필드와 비교하거나 조인할 때 발생합니다. 이 경우 aggregate() 파이프라인에서 $toObjectId 연산자 등을 활용하여 문자열을 ObjectId로 변환하면 문제를 해결할 수 있습니다.