MongoDB에서 연도와 무관하게 월(month)과 일(day)만 기준으로 날짜를 검색하려면 집계 프레임워크(Aggregation Framework)의 $month와 $dayOfMonth 연산자를 활용하는 것이 가장 효과적입니다.
예를 들어 '매년 4월 27일'처럼 특정 월·일 조건에 해당하는 문서를 찾아야 할 때 유용합니다. 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 로그인 날짜(LoginDate) 필드를 포함한 문서들을 저장할 컬렉션을 생성합니다.
> db.monthAndDayDemo.insertOne({"LoginDate": new ISODate("2019-04-27")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefbcaeef71edecf6a1f6b2")
}
> db.monthAndDayDemo.insertOne({"LoginDate": new ISODate("2018-04-30")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefbcb7ef71edecf6a1f6b3")
}
> db.monthAndDayDemo.insertOne({"LoginDate": new ISODate("2018-04-27")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefbcbcef71edecf6a1f6b4")
}
> db.monthAndDayDemo.insertOne({"LoginDate": new ISODate("2016-04-27")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefbdaaef71edecf6a1f6b5")
}2. 전체 문서 확인
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회합니다.
> db.monthAndDayDemo.find();
출력 결과
{ "_id" : ObjectId("5cefbcaeef71edecf6a1f6b2"), "LoginDate" : ISODate("2019-04-27T00:00:00Z") }
{ "_id" : ObjectId("5cefbcb7ef71edecf6a1f6b3"), "LoginDate" : ISODate("2018-04-30T00:00:00Z") }
{ "_id" : ObjectId("5cefbcbcef71edecf6a1f6b4"), "LoginDate" : ISODate("2018-04-27T00:00:00Z") }
{ "_id" : ObjectId("5cefbdaaef71edecf6a1f6b5"), "LoginDate" : ISODate("2016-04-27T00:00:00Z") }3. 월과 일만 검색하는 집계 쿼리
이제 집계 파이프라인을 사용하여 월과 일만 추출하고, 원하는 값(4월 27일)과 일치하는 문서만 필터링합니다. 쿼리 구성은 다음과 같습니다.
- $project: LoginDate에서
$month(월)와$dayOfMonth(일) 값을 각각 m, d 필드로 추출합니다. - $match: 추출된 값 중 m이 4(4월)이고 d가 27(27일)인 문서만 남깁니다.
> db.monthAndDayDemo.aggregate(
{ "$project": {
"m": { "$month": "$LoginDate" },
"d": { "$dayOfMonth": "$LoginDate" }
}},
{ "$match": { "m": 4, "d": 27 } }
);출력 결과
연도와 관계없이 4월 27일에 해당하는 세 개의 문서가 정상적으로 반환됩니다.
{ "_id" : ObjectId("5cefbcaeef71edecf6a1f6b2"), "m" : 4, "d" : 27 }
{ "_id" : ObjectId("5cefbcbcef71edecf6a1f6b4"), "m" : 4, "d" : 27 }
{ "_id" : ObjectId("5cefbdaaef71edecf6a1f6b5"), "m" : 4, "d" : 27 }정리
이처럼 MongoDB에서는 $project로 날짜 필드에서 월과 일을 분리한 뒤, $match로 조건을 걸면 연도 정보를 배제하고 월·일 기준 검색을 손쉽게 구현할 수 있습니다. 생일 알림, 반복 일정 조회 등 매년 같은 날짜에 발생하는 데이터를 찾을 때 이 패턴을 그대로 활용할 수 있습니다.