MongoDB ISODate란?
몽고 셸(mongo shell)은 날짜를 문자열 또는 Date 객체 형태로 반환하는 다양한 메서드를 제공합니다. 그중 ISODate() 생성자는 ISODate() 래퍼를 사용해 Date 객체를 반환하며, MongoDB에서 날짜 데이터를 다룰 때 가장 널리 사용되는 방식입니다.
샘플 데이터 생성
먼저 문서 하나를 담은 컬렉션을 생성해 보겠습니다.
> db.demo548.insertOne({"dueDate":new ISODate("2020-04-09 12:12:40")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8e30499e5f92834d7f05de")
}find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo548.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8e30499e5f92834d7f05de"), "dueDate" : ISODate("2020-04-
09T12:12:40Z") }ISODate에서 연도, 월, 일 등 추출하기
다음은 집계 파이프라인의 $project 단계와 날짜 연산자를 활용해 ISODate 값에서 연도, 월, 일, 시, 분, 초, 밀리초는 물론 연중 몇 번째 날(DayOfYear), 요일(DayOfWeek), 주차(Week)까지 한 번에 추출하는 쿼리입니다.
> db.demo548.aggregate( [ { $project: { Year: { $year: "$dueDate"
}, Month: { $month: "$dueDate" }, Day: { $dayOfMonth: "$dueDate"
}, Hour: { $hour: "$dueDate" }, Minutes: { $minute: "$dueDate" },
Seconds: { $second: "$dueDate" }, Milliseconds: { $millisecond: "$dueDate" },
DayOfYear: { $dayOfYear: "$dueDate" }, DayOfWeek: { $dayOfWeek: "$dueDate"
}, Week: { $week: "$dueDate" } } } ] ).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e8e30499e5f92834d7f05de"),
"Year" : 2020,
"Month" : 4,
"Day" : 9,
"Hour" : 12,
"Minutes" : 12,
"Seconds" : 40,
"Milliseconds" : 0,
"DayOfYear" : 100,
"DayOfWeek" : 5,
"Week" : 14
}주요 날짜 집계 연산자 정리
- $year : 연도 반환 (예: 2020)
- $month : 월 반환 (1~12)
- $dayOfMonth : 일 반환 (1~31)
- $hour / $minute / $second / $millisecond : 시, 분, 초, 밀리초 반환
- $dayOfYear : 해당 연도에서 몇 번째 날인지 반환 (1~366)
- $dayOfWeek : 요일을 숫자로 반환 (1=일요일 ~ 7=토요일)
- $week : 연중 몇 번째 주인지 반환 (0~53)
이처럼 MongoDB의 집계 연산자를 활용하면 별도의 애플리케이션 로직 없이도 저장된 날짜 값에서 원하는 시간 단위의 정보를 손쉽게 추출할 수 있습니다. 날짜별 통계 집계나 리포트 작성 시 특히 유용하게 활용할 수 있습니다.