MongoDB에서 날짜가 문자열 형태로 저장된 경우, 이를 실제 Date 타입으로 변환해야 할 때가 많습니다. 이럴 때는 집계 파이프라인의 $project 단계와 $dateFromString 연산자를 조합하면 간단하게 해결할 수 있습니다.
기본 문법
문자열을 날짜로 변환하는 기본적인 쿼리 구문은 다음과 같습니다.
db.yourCollectionName.aggregate([
{
$project: {
anyVariableName: {
$dateFromString: {
dateString: '$yourFieldName'
}
}
}
}
]);예제 컬렉션 생성
위 문법이 실제로 어떻게 동작하는지 이해하기 위해 샘플 컬렉션을 만들어 보겠습니다. 아래 쿼리는 ConvertStringToDateDemo라는 컬렉션에 날짜 문자열이 담긴 문서들을 하나씩 삽입합니다.
> db.ConvertStringToDateDemo.insertOne({"ArrivalDate":"20-10-2019"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ef3596fd07954a489069f")
}
> db.ConvertStringToDateDemo.insertOne({"ArrivalDate":"21-02-2019"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ef3616fd07954a48906a0")
}
> db.ConvertStringToDateDemo.insertOne({"ArrivalDate":"10-12-2018"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ef36d6fd07954a48906a1")
}
> db.ConvertStringToDateDemo.insertOne({"ArrivalDate":"31-01-2017"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ef37b6fd07954a48906a2")
}저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.ConvertStringToDateDemo.find().pretty();
실행 결과는 다음과 같습니다. ArrivalDate 필드가 아직 문자열(String) 타입으로 저장되어 있는 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5c6ef3596fd07954a489069f"),
"ArrivalDate" : "20-10-2019"
}
{
"_id" : ObjectId("5c6ef3616fd07954a48906a0"),
"ArrivalDate" : "21-02-2019"
}
{
"_id" : ObjectId("5c6ef36d6fd07954a48906a1"),
"ArrivalDate" : "10-12-2018"
}
{
"_id" : ObjectId("5c6ef37b6fd07954a48906a2"),
"ArrivalDate" : "31-01-2017"
}문자열을 날짜로 변환하기
이제 aggregate()와 $dateFromString 연산자를 사용해 문자열을 실제 날짜 타입으로 변환해 보겠습니다.
> db.ConvertStringToDateDemo.aggregate( [ {
... $project: {
... StringToDate: {
... $dateFromString: {
... dateString: '$ArrivalDate'
... }
... }
... }
... } ] ).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6ef3596fd07954a489069f"),
"StringToDate" : ISODate("2019-10-20T00:00:00Z")
}
{
"_id" : ObjectId("5c6ef3616fd07954a48906a0"),
"StringToDate" : ISODate("2019-02-21T00:00:00Z")
}
{
"_id" : ObjectId("5c6ef36d6fd07954a48906a1"),
"StringToDate" : ISODate("2018-12-10T00:00:00Z")
}
{
"_id" : ObjectId("5c6ef37b6fd07954a48906a2"),
"StringToDate" : ISODate("2017-01-31T00:00:00Z")
}출력 결과를 보면 문자열이었던 ArrivalDate 값들이 ISODate 형식의 Date 객체로 성공적으로 변환된 것을 확인할 수 있습니다. 예를 들어 "20-10-2019"는 ISODate("2019-10-20T00:00:00Z")로 변환됩니다.
참고: 날짜 형식(format) 옵션 활용
$dateFromString은 일반적인 날짜 형식을 대부분 자동으로 인식하지만, 입력 형식이 명확하다면 format 옵션으로 지정해 주는 것이 더 안전합니다. 예를 들어 "일-월-년" 순서의 문자열이라면 아래처럼 "%d-%m-%Y" 포맷을 명시하면 됩니다.
$dateFromString: {
dateString: '$ArrivalDate',
format: '%d-%m-%Y'
}또한 변환에 실패했을 때 발생하는 오류를 처리하고 싶다면 onError 옵션을 함께 사용하면, 잘못된 형식의 데이터가 있어도 전체 쿼리가 중단되지 않도록 할 수 있습니다.