MongoDB の集計には Aggregation Framework を使いますが、この機能を python から呼び出す方法を探したところ、英文サイト Stack Overflow に答えがのっていました。
pymongo の aggregate メソッドを使い、pipeline 引数で集計法を指定するらしいです。
では実際に、このサイトの記事を参考に、集計を試してみます。
データは
1 2 3 4 5 6 7 8 9 10 11 |
from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.mydb db.test.insert({'名前':'一郎', '性別':'男', '国語':80, '数学':60}) db.test.insert({'名前':'二郎', '性別':'男', '国語':50, '数学':70}) db.test.insert({'名前':'三郎', '性別':'男', '国語':60, '数学':90}) db.test.insert({'名前':'花子', '性別':'女', '国語':70, '数学':70}) db.test.insert({'名前':'洋子', '性別':'女', '国語':60, '数学':80}) |
男女別の人数や平均点をもとめてみます。
まず シェルから
まず一般的な方法として、シェルからコマンドをたたいて求めてみます。
男女別の人数
1 2 3 4 5 6 7 |
> db.test.aggregate ( {$group : {"_id" : "$性別", "count" : {"$sum" : 1}}} ) { "_id" : "男", "count" : 3 } { "_id" : "女", "count" : 2 } |
男が 3 人、女が 2 人です。
python から
では本題。python から実行してみます。
男女別の人数を sum で
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.mydb pipe = [{ '$group' : { '_id': '$性別', 'count': { '$sum': 1}}}] agg = db.test.aggregate(pipeline = pipe) for r in agg: print r['_id'], r['count'] #-------- 結果 -------- # 男 3 # 女 2 #---------------------- |
男女別の平均を avg で
1 2 3 4 5 6 7 8 9 10 |
pipe = [{ '$group' : { '_id': '$性別', 'average': { '$avg': '$国語'}}}] agg = db.test.aggregate(pipeline = pipe) for r in agg: print r['_id'], r['average'] #-------- 結果 -------- # 男 63.3333333333 # 女 65.0 #---------------------- |
総合計を sum で
1 2 3 4 5 6 7 8 9 |
pipe = [{ '$group' : { '_id': 'null', 'total': { '$sum': '$数学'}}}] agg = db.test.aggregate(pipeline = pipe) for r in agg: print r['_id'], r[u'total'] #-------- 結果 -------- # null 370 #---------------------- |