MongoDB에서 생년월일을 나이로 변환하는 방법
데이터베이스를 다루다 보면 저장된 생년월일(DateOfBirth) 데이터를 바탕으로 현재 나이를 계산해야 하는 경우가 매우 흔합니다. MongoDB의 애그리게이션(Aggregation) 파이프라인을 활용하면 이러한 변환을 손쉽게 처리할 수 있습니다. 이번 글에서는 실제 예제를 통해 생년월일 필드를 나이 값으로 변환하는 전체 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 demo754라는 이름의 컬렉션을 생성하고, 생년월일 정보를 담은 문서 세 개를 삽입합니다.
> db.demo754.insertOne({"DateOfBirth":new Date("2000-05-03")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae9b2da930c785c834e56f")
}
> db.demo754.insertOne({"DateOfBirth":new Date("2010-01-21")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae9b34a930c785c834e570")
}
> db.demo754.insertOne({"DateOfBirth":new Date("2018-05-03")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae9b3da930c785c834e571")
}2단계: find() 메서드로 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo754.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5eae9b2da930c785c834e56f"), "DateOfBirth" : ISODate("2000-05-03T00:00:00Z") }
{ "_id" : ObjectId("5eae9b34a930c785c834e570"), "DateOfBirth" : ISODate("2010-01-21T00:00:00Z") }
{ "_id" : ObjectId("5eae9b3da930c785c834e571"), "DateOfBirth" : ISODate("2018-05-03T00:00:00Z") }3단계: 생년월일을 나이로 변환하는 쿼리 실행
이제 $project 연산자와 aggregate() 메서드를 조합하여 생년월일을 나이로 변환해 보겠습니다.
> db.demo754.aggregate( [ {
... $project: {
... date:"$DateOfBirth",
... StudentAge: {
... $divide: [{$subtract: [ new Date(), "$DateOfBirth" ] },
... (365 * 24*60*60*1000)]
... }
... }
... } ] )쿼리의 동작 원리
이 쿼리는 다음과 같은 순서로 나이를 계산합니다.
1. new Date(): 쿼리가 실행되는 현재 시각을 가져옵니다.
2. $subtract: 현재 시각에서 생년월일을 빼서 두 날짜 사이의 경과 시간을 밀리초 단위로 구합니다.
3. $divide: 경과 시간을 1년에 해당하는 밀리초 값(365 × 24 × 60 × 60 × 1000)으로 나누어 최종 나이를 계산합니다.
실행 결과 확인
쿼리를 실행하면 다음과 같이 StudentAge 필드에 소수점 형태의 나이가 계산되어 출력됩니다.
{ "_id" : ObjectId("5eae9b2da930c785c834e56f"), "date" : ISODate("2000-05-03T00:00:00Z"), "StudentAge" : 20.014896543093606 }
{ "_id" : ObjectId("5eae9b34a930c785c834e570"), "date" : ISODate("2010-01-21T00:00:00Z"), "StudentAge" : 10.288869145833333 }
{ "_id" : ObjectId("5eae9b3da930c785c834e571"), "date" : ISODate("2018-05-03T00:00:00Z"), "StudentAge" : 2.003937638984018 }결과를 보면 2000년 5월 3일생은 약 20.01세, 2010년 1월 21일생은 약 10.29세, 2018년 5월 3일생은 약 2.00세로 계산된 것을 확인할 수 있습니다.
추가 팁: 정수형 나이로 표현하기
소수점 아래 자릿수 없이 깔끔한 정수 나이가 필요하다면, 위 결과에 $floor(내림) 또는 $round(반올림) 연산자를 추가로 적용하면 됩니다. 예를 들어 만 나이 기준으로 계산하고 싶다면 $floor를 사용하는 것이 일반적입니다. 또한 윤년을 더 정확하게 반영하고 싶다면 분모를 365.25 * 24 * 60 * 60 * 1000으로 조정하는 방법도 고려해 볼 수 있습니다.