MongoDB에서 ObjectId는 기본적으로 문서의 고유 식별자로 사용되는 12바이트 BSON 타입입니다. 하지만 애플리케이션 개발 과정에서 이 ObjectId를 문자열 형태로 변환해야 하는 경우가 자주 발생합니다. 예를 들어, API 응답으로 ID를 전달하거나 다른 컬렉션과 문자열 기반으로 데이터를 매칭할 때가 대표적입니다.
$toString 연산자란?
MongoDB에서 ObjectId를 문자열로 변환하려면 집계 파이프라인(aggregate)에서 $toString 연산자를 사용하면 됩니다. 이 연산자는 MongoDB 4.0부터 지원되며, ObjectId뿐만 아니라 다양한 BSON 타입을 문자열로 손쉽게 변환할 수 있습니다.
개념을 이해하기 위해 먼저 샘플 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
1. 샘플 컬렉션 생성 및 데이터 삽입
아래 쿼리로 objectidToStringDemo 컬렉션에 문서를 차례대로 삽입합니다.
> db.objectidToStringDemo.insertOne({"UserName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92b80036de59bd9de0639d")
}
> db.objectidToStringDemo.insertOne({"UserName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92b80436de59bd9de0639e")
}
> db.objectidToStringDemo.insertOne({"UserName":"Larry"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92b80936de59bd9de0639f")
}
> db.objectidToStringDemo.insertOne({"UserName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92b81836de59bd9de063a0")
}2. 저장된 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.objectidToStringDemo.find().pretty();
실행 결과는 다음과 같습니다. 각 문서의 _id 필드에 ObjectId 타입의 값이 저장된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5c92b80036de59bd9de0639d"), "UserName" : "John" }
{ "_id" : ObjectId("5c92b80436de59bd9de0639e"), "UserName" : "Chris" }
{ "_id" : ObjectId("5c92b80936de59bd9de0639f"), "UserName" : "Larry" }
{ "_id" : ObjectId("5c92b81836de59bd9de063a0"), "UserName" : "Robert" }3. $toString으로 ObjectId를 문자열로 변환하기
이제 집계 파이프라인에서 $project 단계와 $toString 연산자를 조합하여 ObjectId를 문자열 값으로 변환해 보겠습니다.
> db.objectidToStringDemo.aggregate([
... {
... $project: {
... _id: {
... $toString: "$_id"
... }
... }
... }
... ]
... );실행 결과를 살펴보면, 기존에 ObjectId(...) 형태였던 _id 값이 따옴표로 감싸진 일반 문자열로 변환된 것을 확인할 수 있습니다.
{ "_id" : "5c92b80036de59bd9de0639d" }
{ "_id" : "5c92b80436de59bd9de0639e" }
{ "_id" : "5c92b80936de59bd9de0639f" }
{ "_id" : "5c92b81836de59bd9de063a0" }마무리 및 참고 사항
이처럼 MongoDB에서는 $toString 연산자 하나만으로 ObjectId를 간단하게 문자열로 변환할 수 있습니다. 몇 가지 추가로 알아두면 좋은 내용은 다음과 같습니다.
- 버전 제한:
$toString은 MongoDB 4.0 이상에서만 사용할 수 있습니다. 그 이전 버전에서는$substr등의 우회 방법을 사용해야 합니다. - 다른 필드 조합:
$concat연산자와 함께 사용하면 변환된 문자열을 다른 텍스트와 결합하여 새로운 필드를 만들 수도 있습니다. - 역변환: 반대로 문자열을 ObjectId로 변환할 때는
$toObjectId연산자를 사용합니다. - 주의점: 유효하지 않은 값을 변환하려고 하면 에러가 발생하므로, 필요하다면
$convert연산자의onError옵션을 활용하는 것이 안전합니다.