티스토리 뷰
728x90
반응형
컬렉션에 아래와 같은 데이터가 들어있다고 가정하고,
db = [
{ 'name': 'A', 'date': datetime.strptime('2021-07-01'), 'money' : 123456789 },
{ 'name': 'A', 'date': datetime.strptime('2021-07-01'), 'money' : 1 },
{ 'name': 'A', 'date': datetime.strptime('2021-07-24'), 'money' : 111111111 },
{ 'name': 'A', 'date': datetime.strptime('2021-08-05'), 'money' : 123456789 },
{ 'name': 'B', 'date': datetime.strptime('2021-08-01'), 'money' : 222222222 },
{ 'name': 'B', 'date': datetime.strptime('2021-07-24'), 'money' : 333333333 },
{ 'name': 'B', 'date': datetime.strptime('2021-07-05'), 'money' : 444444444 },
]
[1] 2021년 7월 1일부터 2021년 8월 1일 사이의 A와 B의 일별 money 합계 리스트를 name은 가나다순으로, date를 7월~8월로 정렬하여 가져오고 싶을 때
아래와 같이 aggregate 안에 match+group+project+sort를 혼합하여 쉽게 가져올 수 있어요.
math에서는 검색조건을, (2021년 7월 1일부터 2021년 8월 1일 사이의)
group에서는 가져올 값을, (A와 B의 일별 money)
project에서는 원하는 변수명으로, (name, date, total)
sort에서는 정렬을 (ame은 가나다순으로, date를 7월~8월로 정렬)
하면 됩니다!!
db.collection.aggregate([
{ '$match':
{ 'date':
{ '$gte': datetime.strptime('2021-07-01', '%Y-%m-%d'),
'$lte': datetime.strptime('2021-08-01', '%Y-%m-%d')
}
}
},
{ '$group':
{ '_id': { "name": "$name", "date":"$date"}, total: { $sum: "$money" } }
},
{ '$project':
{ '_id': 0, 'name': '$_id.name', 'date': '$_id.date', 'total': '$total' }
},
{ '$sort': { 'name': 1, 'date': 1 }
}
])
결과는 아래와 같이 나오게 돼요.
result = [
{ 'name': 'A', 'date': datetime.strptime('2021-07-01'), 'money' : 123456790 },
{ 'name': 'A', 'date': datetime.strptime('2021-07-24'), 'money' : 111111111 },
{ 'name': 'B', 'date': datetime.strptime('2021-07-05'), 'money' : 444444444 },
{ 'name': 'B', 'date': datetime.strptime('2021-07-24'), 'money' : 333333333 },
{ 'name': 'B', 'date': datetime.strptime('2021-08-01'), 'money' : 222222222 },
]
[2] 2021년 7월 1일부터 2021년 8월 1일 사이의 A와 B의 총 money 합계를 가져오고 싶을 때
위의 { '$group': { '_id': { "name": "$name", "date":"$date"}, ...에서 "date"부분만 제거해주면 되는데, _id에 한개(name)만 넣을 경우, { '$group': { '_id': '$name'} } 과 작성해주면 됩니다!
그리고 group, project, sort에서도 안쓰는 date를 삭제해주면,
결과는 아래와 같이 나옵니다!
result = [
{ 'name': 'A', 'money' : 234,567,901 },
{ 'name': 'B', 'money' : 999999999 },
]
끝!
728x90
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[Python3] 리눅스/Windows에서 python gmpy, gmpy2 설치 방법 (0) | 2021.09.13 |
---|---|
[pymongo] 특정 컬럼을 기준으로 중복데이터 제거하기 (0) | 2021.09.03 |
[pymongo] find + distinct 사용하기 (0) | 2021.08.02 |
[folium] 오류해결- marker popup 에서 한글 깨짐 현상 (0) | 2021.07.05 |
[dictionary] 파이썬 딕셔너리 원하는 length만큼 자르기 (0) | 2021.06.22 |
댓글