MongoDB에서 현재 시간("now")과 특정 날짜 사이의 차이를 계산하려면 aggregate() 메서드를 사용하면 됩니다. 핵심 아이디어는 $subtract 연산자로 두 날짜의 차이를 밀리초 단위로 구한 뒤, 이 값을 하루에 해당하는 밀리초(1000 × 60 × 60 × 24)로 나누어 일 단위로 변환하는 것입니다.
1. 샘플 데이터 준비
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo734.insertOne({GivenDate:new ISODate("2020-01-10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead4f1a57bb72a10bcf064e")
}
> db.demo734.insertOne({GivenDate:new ISODate("2020-02-20")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead4f2157bb72a10bcf064f")
}
> db.demo734.insertOne({GivenDate:new ISODate("2010-12-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead4f2b57bb72a10bcf0650")
}
> db.demo734.insertOne({GivenDate:new ISODate("2020-05-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead506f57bb72a10bcf0651")
}2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo734.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5ead4f1a57bb72a10bcf064e"), "GivenDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5ead4f2157bb72a10bcf064f"), "GivenDate" : ISODate("2020-02-20T00:00:00Z") }
{ "_id" : ObjectId("5ead4f2b57bb72a10bcf0650"), "GivenDate" : ISODate("2010-12-01T00:00:00Z") }
{ "_id" : ObjectId("5ead506f57bb72a10bcf0651"), "GivenDate" : ISODate("2020-05-01T00:00:00Z") }3. 현재 시간과 주어진 날짜의 차이 계산하기
다음은 aggregate() 파이프라인을 사용해 "현재 시각"과 GivenDate 필드 값의 차이를 구하는 쿼리입니다.
> db.demo734.aggregate([
... {$project: {
...
... "differenceMilli": {
...
... $subtract:[
... new ISODate(),
... "$GivenDate"
... ]
... }
... }
... },
... {$project: {
...
... "differenceMilli": 1,
... "differenceindays": {
... $divide: [
... "$differenceMilli",
... 1000 * 60 * 60 * 24
... ]
... }
... }
... }]
... )위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5ead4f1a57bb72a10bcf064e"), "differenceMilli" : NumberLong("9802234864"), "differenceindays" : 113.45179240740741 }
{ "_id" : ObjectId("5ead4f2157bb72a10bcf064f"), "differenceMilli" : NumberLong("6259834864"), "differenceindays" : 72.45179240740741 }
{ "_id" : ObjectId("5ead4f2b57bb72a10bcf0650"), "differenceMilli" : NumberLong("297255034864"), "differenceindays" : 3440.4517924074075 }
{ "_id" : ObjectId("5ead506f57bb72a10bcf0651"), "differenceMilli" : NumberLong(125434864), "differenceindays" : 1.4517924074074073 }쿼리 동작 원리
- 첫 번째 $project 단계: new ISODate()로 생성한 현재 시각에서 $GivenDate 필드 값을 빼서 두 날짜의 차이를 밀리초(differenceMilli) 단위로 계산합니다.
- 두 번째 $project 단계: 앞에서 구한 밀리초 차이를 1000 × 60 × 60 × 24, 즉 하루에 해당하는 밀리초 값으로 나누어 일 단위(differenceindays)로 변환합니다.
결과를 살펴보면 각 문서별로 현재 시간을 기준으로 경과한 일수가 소수점 자릿수까지 정확하게 계산되어 출력되는 것을 확인할 수 있습니다. 이 방식은 게시물 작성일로부터 지난 기간 표시, 만료일까지 남은 시간 계산 등 다양한 실무 상황에서 유용하게 활용할 수 있습니다.