MongoDB에서 날짜 데이터가 문자열(String) 형태로 저장되어 있다면, 이를 적절한 날짜(Date) 타입으로 변환해야 정렬, 범위 조회 등 다양한 쿼리 작업을 효율적으로 수행할 수 있습니다. 문자열을 날짜 타입으로 변환하려면 간단한 스크립트를 작성해야 하는데, 이번 글에서는 forEach()와 ISODate()를 활용한 변환 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성하기
먼저 문자열 형태의 날짜 값을 가진 문서들을 포함하는 컬렉션을 생성하겠습니다.
> db.stringToDateDataTypeDemo.insertOne({"CustomerName":"Carol","ShippingDate":"2019-01-21"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2071d66324ffac2a7dc60")
}
> db.stringToDateDataTypeDemo.insertOne({"CustomerName":"Bob","ShippingDate":"2019-02-24"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2073566324ffac2a7dc61")
}
> db.stringToDateDataTypeDemo.insertOne({"CustomerName":"Chris","ShippingDate":"2019-04-01"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2074266324ffac2a7dc62")
}
2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.stringToDateDataTypeDemo.find().pretty();
실행 결과는 다음과 같습니다. 현재 ShippingDate 필드가 문자열로 저장되어 있는 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5ca2071d66324ffac2a7dc60"),
"CustomerName" : "Carol",
"ShippingDate" : "2019-01-21"
}
{
"_id" : ObjectId("5ca2073566324ffac2a7dc61"),
"CustomerName" : "Bob",
"ShippingDate" : "2019-02-24"
}
{
"_id" : ObjectId("5ca2074266324ffac2a7dc62"),
"CustomerName" : "Chris",
"ShippingDate" : "2019-04-01"
}
3. 문자열을 날짜 타입으로 변환하기
이제 forEach()문자열을 반복 처리하면서 ISODate() 함수로 각 문서의 날짜 필드를 변환하고, save() 메서드로 업데이트된 문서를 다시 저장합니다.
> db.stringToDateDataTypeDemo.find().forEach(function(data){
... data.ShippingDate = ISODate(data.ShippingDate);
... db.stringToDateDataTypeDemo.save(data);
... });
이 스크립트는 다음과 같은 순서로 동작합니다.
- find(): 컬렉션의 모든 문서를 가져옵니다.
- forEach(): 각 문서를 순회하며 변환 로직을 실행합니다.
- ISODate(): 문자열 형태의 날짜를 BSON Date 객체로 변환합니다.
- save(): 변환된 문서를 원래 위치에 덮어써 저장합니다.
4. 변환 결과 확인하기
변환이 정상적으로 완료되었는지 확인하기 위해 문서를 다시 한번 조회해 보겠습니다.
> db.stringToDateDataTypeDemo.find().pretty();
실행 결과는 다음과 같습니다. ShippingDate 필드가 더 이상 문자열이 아니라 ISODate() 형식의 날짜 타입으로 변환된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5ca2071d66324ffac2a7dc60"),
"CustomerName" : "Carol",
"ShippingDate" : ISODate("2019-01-21T00:00:00Z")
}
{
"_id" : ObjectId("5ca2073566324ffac2a7dc61"),
"CustomerName" : "Bob",
"ShippingDate" : ISODate("2019-02-24T00:00:00Z")
}
{
"_id" : ObjectId("5ca2074266324ffac2a7dc62"),
"CustomerName" : "Chris",
"ShippingDate" : ISODate("2019-04-01T00:00:00Z")
}
마무리
이처럼 MongoDB에서는 forEach()와 ISODate()를 조합하여 문자열로 저장된 날짜 데이터를 손쉽게 Date 타입으로 변환할 수 있습니다. 참고로 대량의 데이터를 다루는 경우에는 집계 파이프라인의 $toDate 연산자나 $convert 연산자를 활용하는 방법도 있으니, 상황에 맞게 선택하여 사용하시기 바랍니다.