티스토리 뷰

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
반응형
댓글