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

MongoDB에서 날짜별 정렬 및 사용자별 그룹화를 한 번에 처리하는 쿼리 작성법

MongoDB에서 날짜 기준으로 데이터를 정렬하고 사용자별로 그룹화해야 한다면 aggregate() 메서드를 활용하는 것이 가장 효율적입니다. 이 글에서는 실제 예제를 통해 단일 쿼리로 두 가지 작업을 동시에 처리하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 테스트용 문서들이 담긴 컬렉션을 만들어 보겠습니다. insertOne() 메서드를 사용해 userId와 dueDate 필드를 가진 문서들을 삽입합니다.

> db.demo243.insertOne({"userId":1,dueDate:new ISODate("2019-01-10")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4575f81627c0c63e7dba5f")
}
> db.demo243.insertOne({"userId":2,dueDate:new ISODate("2019-11-10")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4576011627c0c63e7dba60")
}
> db.demo243.insertOne({"userId":2,dueDate:new ISODate("2020-01-31")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4576151627c0c63e7dba61")
}
> db.demo243.insertOne({"userId":1,dueDate:new ISODate("2010-01-10")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e45761b1627c0c63e7dba62")
}

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo243.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e4575f81627c0c63e7dba5f"), "userId" : 1, "dueDate" : ISODate("2019-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e4576011627c0c63e7dba60"), "userId" : 2, "dueDate" : ISODate("2019-11-10T00:00:00Z") }
{ "_id" : ObjectId("5e4576151627c0c63e7dba61"), "userId" : 2, "dueDate" : ISODate("2020-01-31T00:00:00Z") }
{ "_id" : ObjectId("5e45761b1627c0c63e7dba62"), "userId" : 1, "dueDate" : ISODate("2010-01-10T00:00:00Z") }

3. 날짜 정렬과 사용자 그룹화 쿼리 실행하기

이제 핵심인 aggregate() 쿼리를 살펴보겠습니다. $group 스테이지에서 _id를 userId로 지정해 사용자별로 그룹화하고, $max 연산자를 사용해 각 사용자의 가장 최근 dueDate를 추출합니다.

> db.demo243.aggregate({
...   $group: {
...      _id : '$userId',
...      dueDate: { $max: '$dueDate'}
...   }
...})

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

{ "_id" : 2, "dueDate" : ISODate("2020-01-31T00:00:00Z") }
{ "_id" : 1, "dueDate" : ISODate("2019-01-10T00:00:00Z") }

결과 분석

출력 결과를 보면 각 사용자(userId)별로 하나의 문서만 반환되며, 해당 사용자가 가진 dueDate 중 가장 최신 날짜가 표시됩니다. userId 2의 경우 2019-11-10과 2020-01-31 두 개의 문서가 있었지만, $max 연산자 덕분에 더 최근인 2020-01-31만 선택되었습니다.

만약 가장 오래된 날짜를 구하고 싶다면 $max 대신 $min 연산자를 사용하면 됩니다. 또한 $sort 스테이지를 추가하면 그룹화된 결과를 원하는 순서대로 정렬할 수도 있습니다. 이처럼 aggregation 파이프라인은 여러 스테이지를 조합해 복잡한 데이터 처리 로직도 하나의 쿼리로 해결할 수 있는 강력한 도구입니다.