MongoDB에서 문자열을 ObjectId로 변환하는 방법
MongoDB를 사용하다 보면 문자열(String) 형태로 저장된 값을 ObjectId 타입으로 변환해야 하는 경우가 종종 있습니다. 예를 들어, 애플리케이션에서 ObjectId를 문자열로 저장한 후 이를 다시 ObjectId로 변환하여 참조나 조인 작업에 활용할 때 유용합니다. 이럴 때 집계 파이프라인의 $toObjectId 연산자를 사용하면 간단하게 해결할 수 있습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 생성하고, 문자열 형태의 ID 값을 가진 문서를 삽입해 보겠습니다.
> db.demo95.insertOne({"Id":"5ab9cbe531c2ab715d42129a"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2d5ef5b8903cdd865577ac")
}2. 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo95.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e2d5ef5b8903cdd865577ac"), "Id" : "5ab9cbe531c2ab715d42129a" }출력 결과를 보면 "Id" 필드가 문자열 타입으로 저장되어 있는 것을 확인할 수 있습니다.
3. $toObjectId로 문자열 변환하기
다음은 $toObjectId 연산자를 사용하여 문자열을 ObjectId로 변환하는 집계 쿼리입니다.
> db.demo95.aggregate([ { "$addFields": { "d" : { "$toObjectId": "$Id" } }} ])실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e2d5ef5b8903cdd865577ac"), "Id" : "5ab9cbe531c2ab715d42129a", "d" : ObjectId("5ab9cbe531c2ab715d42129a") }쿼리 동작 원리
$addFields 단계는 기존 문서에 새로운 필드를 추가하는 역할을 합니다. 위 쿼리에서는 "d"라는 새 필드를 생성하고, 그 값으로 $toObjectId를 적용하여 "Id" 필드의 문자열 값을 ObjectId로 변환한 결과를 저장합니다. 원본 "Id" 필드는 그대로 유지되며, 변환된 값은 새 필드 "d"에 담기게 됩니다.
참고로 $toObjectId는 24자리 16진수 형식의 유효한 ObjectId 문자열만 변환할 수 있으며, 잘못된 형식의 문자열이 입력되면 에러가 발생합니다. 변환이 실패할 수 있는 데이터를 안전하게 처리하려면 $convert 연산자와 onError 옵션을 함께 사용하는 것도 좋은 방법입니다.