MongoDB에서 문서를 조건에 맞게 필터링할 때는 $match 연산자를 사용하고, 두 날짜 사이의 데이터를 조회할 때는 $gte(크거나 같음)와 $lte(작거나 같음) 연산자를 활용합니다. 이번 글에서는 특정 값 조건과 날짜 범위를 함께 적용한 뒤, 그룹화하여 합계($sum)와 개수(count)를 구하는 방법을 예제와 함께 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 demo560 컬렉션을 만들고 테스트용 문서를 삽입합니다.
> db.demo560.insertOne({"value1":40,"value2":40,shippingDate:new ISODate("2020-02-26")});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e867")
}
> db.demo560.insertOne({"value1":20,"value2":60,shippingDate:new ISODate("2020-02-26")});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e868")
}
> db.demo560.insertOne({"value1":40,"value2":70,shippingDate:new ISODate("2020-03-31")});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e869")
}
> db.demo560.insertOne({"value1":40,"value2":130,shippingDate:new ISODate("2020-03-31")});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f3d5254b4472ed3e8e86a")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo560.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e867"), "value1" : 40, "value2" : 40, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e868"), "value1" : 20, "value2" : 60, "shippingDate" : ISODate("2020-02-26T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e869"), "value1" : 40, "value2" : 70, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }
{ "_id" : ObjectId("5e8f3d5254b4472ed3e8e86a"), "value1" : 40, "value2" : 130, "shippingDate" : ISODate("2020-03-31T00:00:00Z") }3. 날짜 범위와 특정 값으로 그룹화 및 집계
다음은 value1이 40인 문서 중 shippingDate가 2020-02-26부터 2020-03-31 사이에 있는 데이터를 조회하고, 배송일(shippingDate) 기준으로 그룹화하여 value2의 합계(total)와 문서 개수(count)를 계산하는 쿼리입니다.
> db.demo560.aggregate([
... {
$match: {
"value1": 40,
"shippingDate": {
"$gte": ISODate("2020-02-26"),
"$lte": ISODate("2020-03-31")
}
}
... },
... {
$group: {
"_id": "$shippingDate",
total: {
$sum: '$value2'
},
count: {
$sum: 1
}
}
... }
... ])
쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ISODate("2020-03-31T00:00:00Z"), "total" : 200, "count" : 2 }
{ "_id" : ISODate("2020-02-26T00:00:00Z"), "total" : 40, "count" : 1 }결과를 보면 2020-03-31에는 value1이 40인 문서가 2건 존재하고 value2의 합계는 200이며, 2020-02-26에는 1건이 존재하고 합계는 40임을 알 수 있습니다. 이처럼 $match로 조건을 걸고 $group과 $sum을 조합하면 날짜별 통계 데이터를 손쉽게 추출할 수 있습니다.