今回は、集計結果のソート/表示件数制限/取得開始位置の指定を行います。
サンプルデータ
以前用意した会社の部、課、従業員データを使用します。
集計処理(aggregate)①データ準備 - https://ailog.site/2021/09/02/2021/0902/
集計結果のソート
集計結果をソートしてみます。
集計結果のソートには$sortを使います。
[Mongoシェル]
1 2 3 4 5 6 7 8
| > db.employee.aggregate([ {$group:{_id:"$k_id", max_salary:{$max: "$salary"}}}, {$sort:{max_salary:1}} // 1:昇順 -1:降順 ]) { "_id" : "ka4", "max_salary" : 120000 } { "_id" : "ka2", "max_salary" : 250000 } { "_id" : "ka1", "max_salary" : 400000 } { "_id" : "ka3", "max_salary" : 550000 }
|
課ごとの最大給料に関して、昇順でソートすることができました。
集計結果の表示件数制限
集計結果の表示件数を制限します。
集計結果の表示件数制限には$limitを使います。
[Mongoシェル]
1 2 3 4 5 6
| > db.employee.aggregate([ {$group:{_id:"$k_id", max_salary:{$max: "$salary"}}}, {$sort:{max_salary:1}}, {$limit: 1} ]) { "_id" : "ka4", "max_salary" : 120000 }
|
課ごとの最大給料に関して、表示件数を1件に制限することができました。
集計結果の取得開始位置の指定
集計結果の取得開始位置を指定します。
集計結果の表示開始位置を指定するためには$skipを使用します。
[Mongoシェル]
1 2 3 4 5 6 7 8
| > db.employee.aggregate([ {$group:{_id:"$k_id", max_salary:{$max: "$salary"}}}, {$sort:{max_salary:1}}, {$skip: 1} ]) { "_id" : "ka2", "max_salary" : 250000 } { "_id" : "ka1", "max_salary" : 400000 } { "_id" : "ka3", "max_salary" : 550000 }
|
課ごとの最大給料に関して、表示開始位置を2つめからとすることができました。
$skipに指定するインデックスは0から始まりますので、1を指定した場合は2つめの集計結果から表示されることになります。
$sort、$limit、$skip は組み合わせて実行することが可能ですが、上から順番に実行されるので順番には気を付ける必要があります。
Pythonで操作
上記の集計処理をPythonで行うと、次のようになります。
[ソースコード]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import pymongo from pymongo import MongoClient
client = MongoClient()
db1 = client.db1
docs = db1.employee.aggregate([ {'$group':{'_id':'$k_id', 'max_salary':{'$max': '$salary'}}}, {'$sort':{'max_salary':1}} ]) for doc in docs: print(doc)
docs = db1.employee.aggregate([ {'$group':{'_id':'$k_id', 'max_salary':{'$max': '$salary'}}}, {'$sort':{'max_salary':1}}, {'$limit': 1} ]) for doc in docs: print(doc)
docs = db1.employee.aggregate([ {'$group':{'_id':'$k_id', 'max_salary':{'$max': '$salary'}}}, {'$sort':{'max_salary':1}}, {'$skip': 1} ]) for doc in docs: print(doc)
|
次回からは、一括高速処理(Bulk)を行います。