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

MongoDB 컬렉션에서 날짜별로 그룹화하는 방법

MongoDB에서 날짜를 기준으로 데이터를 그룹화하려면 집계 파이프라인(aggregate)의 $group 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 날짜별 그룹화 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 문서(document)가 포함된 컬렉션을 생성합니다. insertOne() 메서드를 사용해 세 개의 문서를 삽입해 보겠습니다.

> db.demo657.insertOne({
    id: 1,
    Name: "Chris",
    DueDate: new ISODate("2020-04-22")
});
> db.demo657.insertOne({
    id: 1,
    Name: "John",
    DueDate: new ISODate("2020-04-22")
});
> db.demo657.insertOne({
    id: 1,
    Name: "Chris",
    DueDate: new ISODate("2020-04-22")
});

2. 저장된 문서 확인하기

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

> db.demo657.find();

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

{ "_id" : ObjectId("5ea064b44deddd72997713d6"), "id" : 1, "Name" : "Chris", "DueDate" : ISODate("2020-04-22T00:00:00Z") }
{ "_id" : ObjectId("5ea064b44deddd72997713d7"), "id" : 1, "Name" : "John", "DueDate" : ISODate("2020-04-22T00:00:00Z") }
{ "_id" : ObjectId("5ea064b44deddd72997713d8"), "id" : 1, "Name" : "Chris", "DueDate" : ISODate("2020-04-22T00:00:00Z") }

3. 날짜별 그룹화 쿼리 작성하기

MongoDB 컬렉션에서 날짜별로 그룹화하려면 $match, $project, $group 세 단계의 집계 파이프라인을 활용합니다.

  • $match: 특정 조건(id와 DueDate 범위)에 해당하는 문서만 필터링합니다.
  • $project: $dayOfMonth, $month, $year 연산자로 DueDate에서 일, 월, 연도를 추출합니다.
  • $group: 추출한 날짜 정보를 기준으로 문서를 묶고, $push로 이름 목록을 배열에 담습니다.
> db.demo657.aggregate([
    {$match: {id:1, DueDate: {$gte:new ISODate('2020-04-21'), $lt:new ISODate("2020-04-23")}}},
    {$project:
    {day: {'$dayOfMonth': '$DueDate'},month: {'$month':'$DueDate'},year: {'$year':'$DueDate'},Name:"$Name" }
},
    {$group: {
        _id: {day:'$day',month:'$month',year:'$year'},
        ListOfNames: {$push:{Name:'$Name'}}
    }}
])

4. 실행 결과

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

{ "_id" : { "day" : 22, "month" : 4, "year" : 2020 }, "ListOfNames" : [ { "Name" : "Chris" }, { "Name" : "John" }, { "Name" : "Chris" } ] }

결과를 보면 2020년 4월 22일이라는 동일한 날짜를 가진 세 개의 문서가 하나의 그룹으로 묶이고, 각 문서의 이름이 ListOfNames 배열에 포함된 것을 확인할 수 있습니다. 이처럼 MongoDB의 집계 파이프라인을 활용하면 날짜 단위로 손쉽게 데이터를 그룹화할 수 있습니다.