MongoDB에서 날짜 데이터가 문자열(String) 형태로 저장되어 있으면, 쿼리나 애그리게이션(집계) 파이프라인 실행 중에 “Failed to convert from type String to type Date”(문자열 유형에서 날짜 유형으로 변환 실패) 오류가 발생할 수 있습니다.
이 문제를 해결하는 핵심은 바로 $dateFromString 연산자입니다. $dateFromString은 날짜·시간 문자열을 Date 객체로 변환해 주는 MongoDB 집계 연산자로, timezone 옵션을 함께 지정하면 특정 시간대를 기준으로 변환할 수도 있습니다.
아래 예제를 통해 단계별로 살펴보겠습니다.
1단계. 컬렉션 생성 및 문서 삽입
먼저 demo619 컬렉션을 만들고, DueDate 필드에 문자열 형식의 날짜 값을 담은 문서를 세 개 삽입합니다.
> db.demo619.insertOne({"DueDate":"10-10-2020"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d7846c954c74be91e69e")
}
> db.demo619.insertOne({"DueDate":"12-01-2019"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d7996c954c74be91e69f")
}
> db.demo619.insertOne({"DueDate":"28-10-2010"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d7ab6c954c74be91e6a0")
}
2단계. find() 메서드로 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo619.find();
실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e99d7846c954c74be91e69e"), "DueDate" : "10-10-2020" }
{ "_id" : ObjectId("5e99d7996c954c74be91e69f"), "DueDate" : "12-01-2019" }
{ "_id" : ObjectId("5e99d7ab6c954c74be91e6a0"), "DueDate" : "28-10-2010" }
현재 DueDate 필드의 값이 모두 따옴표로 묶인 문자열로 저장되어 있는 것을 확인할 수 있습니다.
3단계. $dateFromString으로 문자열을 Date 객체로 변환하기
이제 aggregate() 안에서 $project 단계와 $dateFromString을 조합해 문자열 날짜를 실제 Date 객체로 변환합니다. 여기서는 America/New_York 시간대를 기준으로 지정했습니다.
> db.demo619.aggregate( [ {
... $project: {
... DueDate: {
... $dateFromString: {
... dateString: '$DueDate',
... timezone: 'America/New_York'
... }
... }
... }
... } ] )
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e99d7846c954c74be91e69e"), "DueDate" : ISODate("2020-10-10T04:00:00Z") }
{ "_id" : ObjectId("5e99d7996c954c74be91e69f"), "DueDate" : ISODate("2019-01-12T05:00:00Z") }
{ "_id" : ObjectId("5e99d7ab6c954c74be91e6a0"), "DueDate" : ISODate("2010-10-28T04:00:00Z") }
문자열이었던 날짜 값이 ISODate(...) 형태의 진짜 Date 객체로 성공적으로 변환된 것을 확인할 수 있습니다.
마무리 및 추가 팁
$dateFromString을 활용하면 문자열로 저장된 날짜를 손쉽게 Date 객체로 변환할 수 있으며, 이후에는 날짜 범위 조회, 정렬, 그룹화 같은 날짜 기반 연산을 자유롭게 수행할 수 있습니다. 변환된 결과를 원본 컬렉션에 그대로 반영하고 싶다면 $out 또는 $merge 단계를 함께 사용하면 됩니다.
또한 “dd-MM-yyyy”처럼 표준 ISO 8601 형식이 아닌 문자열이라면 format 옵션(예: format: '%d-%m-%Y')을 추가로 지정해 주면 더욱 안정적으로 파싱할 수 있습니다.