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

MongoDB에서 특정 날짜 이전에 생성된 모든 객체를 조회하는 방법 ($lt 연산자 활용)

MongoDB에서 특정 날짜 이전의 문서 조회하기

MongoDB에서 지정된 날짜보다 이전에 저장된 문서를 찾고 싶다면 $lt(less than) 연산자를 사용하면 됩니다. $lt 연산자는 필드 값이 주어진 값보다 작은 문서만 선택하는 비교 연산자로, ISODate 형식의 날짜 데이터와 함께 사용하면 손쉽게 원하는 기간의 데이터를 추출할 수 있습니다.

실제 동작 과정을 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테스트용 컬렉션 생성 및 문서 삽입

먼저 사용자 로그인 날짜(UserLoginDate)를 담은 문서들을 컬렉션에 삽입합니다.

> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2016-03-21')});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cbd91e4de8cc557214c0e0d")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2016-05-11')});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cbd91ecde8cc557214c0e0e")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2017-01-31')});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cbd91f9de8cc557214c0e0f")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2018-05-15')});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cbd9206de8cc557214c0e10")
}
> db.beforeSpecifyDateDemo.insertOne({"UserLoginDate":new ISODate('2019-04-01')});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cbd9211de8cc557214c0e11")
}

2단계: find() 메서드로 전체 문서 확인

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. pretty() 메서드를 함께 사용하면 결과를 보기 좋게 정렬하여 출력합니다.

> db.beforeSpecifyDateDemo.find().pretty();

위 쿼리는 다음과 같은 출력 결과를 반환합니다.

{
   "_id" : ObjectId("5cbd91e4de8cc557214c0e0d"),
   "UserLoginDate" : ISODate("2016-03-21T00:00:00Z")
}
{
   "_id" : ObjectId("5cbd91ecde8cc557214c0e0e"),
   "UserLoginDate" : ISODate("2016-05-11T00:00:00Z")
}
{
   "_id" : ObjectId("5cbd91f9de8cc557214c0e0f"),
   "UserLoginDate" : ISODate("2017-01-31T00:00:00Z")
}
{
   "_id" : ObjectId("5cbd9206de8cc557214c0e10"),
   "UserLoginDate" : ISODate("2018-05-15T00:00:00Z")
}
{
   "_id" : ObjectId("5cbd9211de8cc557214c0e11"),
   "UserLoginDate" : ISODate("2019-04-01T00:00:00Z")
}

3단계: $lt 연산자로 특정 날짜 이전의 문서 조회

이제 핵심 부분입니다. UserLoginDate 필드 값이 2017년 1월 31일보다 이전인 문서만 조회하려면 아래와 같이 $lt 연산자에 ISODate 값을 지정합니다.

> db.beforeSpecifyDateDemo.find({UserLoginDate: { "$lt": ISODate("2017-01-31") }});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cbd91e4de8cc557214c0e0d"), "UserLoginDate" : ISODate("2016-03-21T00:00:00Z") }
{ "_id" : ObjectId("5cbd91ecde8cc557214c0e0e"), "UserLoginDate" : ISODate("2016-05-11T00:00:00Z") }

결과 분석 및 참고 사항

총 5개의 문서 중 2016-03-21과 2016-05-11 두 개의 문서만 반환되었습니다. 그 이유는 $lt 연산자가 지정한 날짜보다 엄격하게 작은(strictly less than) 값만 매칭하기 때문입니다. 따라서 기준일인 2017-01-31 자체의 문서는 결과에 포함되지 않습니다.

만약 기준 날짜 당일의 문서까지 포함하고 싶다면 $lte(less than or equal) 연산자를 대신 사용하면 됩니다. 반대로 특정 날짜 이후의 문서를 조회할 때는 $gt(greater than) 또는 $gte(greater than or equal) 연산자를 활용할 수 있습니다.

또한 실무 환경에서는 날짜 필드에 인덱스를 생성해두면 대량의 데이터를 조회할 때도 쿼리 성능을 크게 향상시킬 수 있으니 참고하시기 바랍니다.