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

MongoDB에서 현재 시간과 특정 날짜 간의 차이 구하는 방법

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)로 변환합니다.

결과를 살펴보면 각 문서별로 현재 시간을 기준으로 경과한 일수가 소수점 자릿수까지 정확하게 계산되어 출력되는 것을 확인할 수 있습니다. 이 방식은 게시물 작성일로부터 지난 기간 표시, 만료일까지 남은 시간 계산 등 다양한 실무 상황에서 유용하게 활용할 수 있습니다.