Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 애그리게이션으로 생년월일(DateOfBirth)을 나이로 변환하는 완벽 가이드

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으로 조정하는 방법도 고려해 볼 수 있습니다.