aggregation 주요 명령 (group/match/sort/sum)

4. aggregation 주요 명령 (group/match/sort/sum)

$group (GROUP BY), $match (WHERE), $sort (ORDER BY), $sum (SUM)

4.1. group & sum

  • SQL 구문과 비교하며 작성할 것
  • 한번에 만들기 어려우면, 일단 SQL 구문으로 만든 후, 유사 변경 예를 보며 mongodb aggregate로 바꿀 것
  • _id 필드는 mandatory, 하지만, 전체 doc에 대한 계산값이 필요할 때는 null 로 넣으면 됨
# SQL: SELECT COUNT(*) AS count FROM zip
# mongodb aggreate:
result = db.zip.aggregate([
    {'$group' : 
        {
            '_id' : 'null', 
            'count' : {'$sum' : 1}
        }
    } 
])
for record in result:
    print(record)
# SQL: SELECT SUM(pop) AS count FROM zip
# mongodb aggreate:
result = db.zip.aggregate([
    {'$group' : 
        {
            '_id' : 'null', 
            'total' : {'$sum' : '$pop'}
        }
    } 
])
for record in result:
    print(record)
# SQL: SELECT state, SUM(pop) FROM zip GROUP BY state
# mongodb aggreate:
result = db.zip.aggregate([
    {'$group' : 
        {
            '_id' : '$state', 
            'total_pop' : {'$sum' : '$pop'}
        }
    } 
])
for record in result:
    print(record)
이해하고 실습하기
city 로 그룹핑해서, pop 의 합계를 출력하는데, 5개만 출력해보자
result = db.zip.aggregate([
    {'$group' : 
        {
            '_id' : '$city', 
            'total_pop' : {'$sum' : '$pop'}
        }
    },
    { '$limit' : 5 }
])
for record in result:
    print(record)

4.2. sort

  • sort order는 1 또는 -1
# SQL: SELECT state, SUM(pop) FROM zip GROUP BY state ORDER BY SUM(pop)
# mongodb aggreate:
result = db.zip.aggregate([
    {'$group' : 
        {
            '_id' : '$state', 
            'total_pop' : {'$sum' : '$pop'}
        }
    }, 
    {'$sort' : 
        {'total_pop': 1} 
    },
    {'$limit' : 5},
    {'$project' : { '_id' : 0 }}
])
for record in result:
    print(record)

4.3. match

# SQL: SELECT * FROM zip WHERE pop >= 100000 
# mongodb aggregate:
result = db.zip.aggregate([
    {'$match' : {'pop' : {'$gte' : 100000} } },
    {'$limit' : 5 }
])
for record in result:
    print(record)
# SQL: SELECT * FROM zip WHERE state = 'MA' 
# mongodb aggregate:
result = db.zip.aggregate([
    {'$match' : {'state' : 'MA'}}
])
for record in result:
    print(record)
# SQL: SELECT COUNT(*) FROM zip WHERE state = 'MA' 
# mongodb aggregate:
result = db.zip.aggregate([

    {'$match' : {'state' : 'MA'}},

    {'$group' : {'_id' : 'null', 'count' : {'$sum' : 1}}} 

])
for record in result:
    print(record)
이해하고 실습하기
state 로 그룹핑, state 가 MA 인 pop 의 합계를 출력하기
result = db.zip.aggregate([

    { '$match' : { 'state' : 'MA'}},

    { '$group' : { '_id' : '$state', 
                   'count' : { '$sum' : '$pop'}}
    }
    

])
for record in result:
    print(record)