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

MongoDB에서 이전 달 데이터 조회하는 방법

MongoDB에서 이전 달에 해당하는 데이터를 조회하려면 현재 날짜를 구한 뒤 월(month) 값에서 1을 빼는 방식을 사용하면 됩니다. JavaScript Date 객체가 제공하는 setMonth()getMonth() 메서드를 활용하면 간단하게 구현할 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 예제에 사용할 컬렉션을 만들고 insertOne() 메서드로 문서를 삽입합니다. 고객 이름(CustomerName)과 구매 날짜(PurchaseDate) 필드로 구성된 세 개의 문서를 추가해 보겠습니다.

> db.findOneMonthAgoData.insertOne({"CustomerName":"Chris","PurchaseDate":new ISODate("2019-12-26")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e04e16c150ee0e76c06a04f")
}
> db.findOneMonthAgoData.insertOne({"CustomerName":"David","PurchaseDate":new ISODate("2019-11-26")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e04e178150ee0e76c06a050")
}
> db.findOneMonthAgoData.insertOne({"CustomerName":"Bob","PurchaseDate":new ISODate("2020-11-26")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e04e186150ee0e76c06a051")
}

2. 저장된 전체 문서 확인하기

다음은 find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회하는 쿼리입니다.

> db.findOneMonthAgoData.find();

쿼리를 실행하면 아래와 같이 세 개의 문서가 모두 출력됩니다.

{ "_id" : ObjectId("5e04e16c150ee0e76c06a04f"), "CustomerName" : "Chris", "PurchaseDate" : ISODate("2019-12-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e178150ee0e76c06a050"), "CustomerName" : "David", "PurchaseDate" : ISODate("2019-11-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e186150ee0e76c06a051"), "CustomerName" : "Bob", "PurchaseDate" : ISODate("2020-11-26T00:00:00Z") }

3. 이전 달 데이터 조회 쿼리 작성하기

이제 핵심 단계입니다. new Date()로 현재 시각을 담은 Date 객체를 생성한 뒤, setMonth(getMonth() - 1)을 호출해 한 달 전 시점을 계산합니다. 그리고 이 값을 $gte(이상, greater than or equal) 연산자와 함께 사용하면 해당 시점 이후의 데이터만 조회할 수 있습니다.

> monthData=new Date();
ISODate("2019-12-26T16:43:04.283Z")
> monthData.setMonth(monthData.getMonth() - 1);
1574786584283
> db.findOneMonthAgoData.find({PurchaseDate:{$gte:monthData}});

실행 결과를 보면 2019년 11월 26일에 구매한 David의 문서는 제외되고, 그 이후 날짜인 Chris와 Bob의 문서만 반환된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e04e16c150ee0e76c06a04f"), "CustomerName" : "Chris", "PurchaseDate" : ISODate("2019-12-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e186150ee0e76c06a051"), "CustomerName" : "Bob", "PurchaseDate" : ISODate("2020-11-26T00:00:00Z") }

정리

new Date()로 현재 시각을 얻은 다음 setMonth(monthData.getMonth() - 1)을 호출하면 정확히 한 달 전 시점의 Date 객체가 됩니다. 이 값을 쿼리 조건의 $gte 연산자에 넣으면 “한 달 전부터 지금까지” 범위에 있는 문서만 깔끔하게 추출할 수 있습니다. 특히 12월에서 1월로 넘어가는 연말·연초처럼 월의 경계를 넘는 경우에도 Date 객체가 연도를 자동으로 조정해 주기 때문에 별도의 예외 처리 없이 안정적으로 동작한다는 점이 큰 장점입니다.