MongoDB에서 배열 항목에 $dateToString 적용하기
MongoDB에서 배열(array) 내부에 저장된 날짜 값을 특정 형식의 문자열로 변환해야 할 때가 있습니다. 이 경우 aggregate() 메서드와 $map 연산자를 조합하면 배열의 각 요소에 $dateToString을 손쉽게 적용할 수 있습니다.
1. 샘플 데이터 준비하기
먼저 예제에 사용할 컬렉션을 생성하고 문서를 하나 삽입합니다. 아래 문서에는 애플리케이션 이름과 고객 정보가 담긴 Details 배열이 포함되어 있으며, 배열 요소 안에 마감일(Deadline) 날짜 값이 들어 있습니다.
> db.demo104.insertOne(
... {
... "AppName" : "Online Book",
... "Details" : [
... {
... "ClientName" : "Chris",
... "Deadline" : new ISODate("2020-03-10")
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2ed7fd9fd5fd66da21446f")
}
2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.demo104.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e2ed7fd9fd5fd66da21446f"),
"AppName" : "Online Book",
"Details" : [
{
"ClientName" : "Chris",
"Deadline" : ISODate("2020-03-10T00:00:00Z")
}
]
}3. $dateToString으로 배열 항목 변환하기
이제 집계 파이프라인에서 $project와 $map을 조합하여 Details 배열의 각 Deadline 값을 월(month)만 표시하는 문자열로 변환해 보겠습니다.
> db.demo104.aggregate([
... { "$match": {}},
... { "$project": {
... "title": 1,
... "Details": {
... "$map": {
... "input": "$Details",
... "as": "out",
... "in": {
... "ClientName": "$$out.ClientName",
... "Deadline": {
... "$dateToString": { "format": "%m", "date": "$$out.Deadline" }
... }
... }
... }
... }
... }}
... ])
실행 결과는 다음과 같습니다. Deadline 필드가 ISODate 객체에서 "03"이라는 월(month) 문자열로 변환된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e2ed7fd9fd5fd66da21446f"), "Details" : [ { "ClientName" : "Chris", "Deadline" : "03" } ] }핵심 정리
- $match: 조건에 맞는 문서를 먼저 필터링합니다. 빈 조건({})을 지정하면 모든 문서가 대상이 됩니다.
- $project: 출력할 필드를 지정하고 배열 필드를 재구성합니다.
- $map: 배열의 각 요소를 순회하며 새로운 형태로 변환합니다.
as로 선언한 변수($$out)를 통해 개별 요소에 접근합니다. - $dateToString: Date 값을 지정한 형식의 문자열로 변환합니다. 여기서는 %m을 사용해 두 자리 월을 추출했습니다.
이처럼 $map과 $dateToString을 함께 활용하면 배열 안에 중첩된 날짜 데이터도 원하는 형식으로 자유롭게 가공할 수 있습니다.