MongoDB(31) - 集計処理(aggregate)⑫集計結果のソート/表示件数制限/取得開始位置の指定

今回は、集計結果のソート/表示件数制限/取得開始位置の指定を行います。

サンプルデータ

以前用意した会社の部、課、従業員データを使用します。

集計処理(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

# MongoDB操作用のインスタンスを作成
client = MongoClient() # [IPとポートを指定する場合] MongoClient('10.200.243.203', 27017')

# データベースの取得
db1 = client.db1

# 集計結果のソート
docs = db1.employee.aggregate([
{'$group':{'_id':'$k_id', 'max_salary':{'$max': '$salary'}}},
{'$sort':{'max_salary':1}} # 1:昇順 -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)を行います。