MongoDB(24) - 集計処理(aggregate)⑤最大値・最小値・平均値の集計

今回は、最大値・最小値・平均値の集計を行います。

サンプルデータ

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

集計処理(aggregate)①データ準備 - https://ailog.site/2021/09/02/2021/0902/

最大値取得

$maxを使うと、最大値を取得することができます。

[Mongoシェル]

1
2
3
4
5
6
7
> db.employee.aggregate([
{$group: {_id:"$k_id", salary_max:{$max:"$salary"}}}
])
{ "_id" : "ka1", "salary_max" : 400000 }
{ "_id" : "ka3", "salary_max" : 550000 }
{ "_id" : "ka4", "salary_max" : 120000 }
{ "_id" : "ka2", "salary_max" : 250000 }

最小値取得

$minを使うと、最小値を取得することができます。

[Mongoシェル]

1
2
3
4
5
6
7
> db.employee.aggregate([
{$group: {_id:"$k_id", salary_min:{$min:"$salary"}}}
])
{ "_id" : "ka1", "salary_min" : 400000 }
{ "_id" : "ka3", "salary_min" : 200000 }
{ "_id" : "ka4", "salary_min" : 100000 }
{ "_id" : "ka2", "salary_min" : 250000 }

平均値取得

$avgを使うと、平均値を取得することができます。

[Mongoシェル]

1
2
3
4
5
6
7
> db.employee.aggregate([
{$group: {_id:"$k_id", salary_avg:{$avg:"$salary"}}}
])
{ "_id" : "ka1", "salary_avg" : 400000 }
{ "_id" : "ka2", "salary_avg" : 250000 }
{ "_id" : "ka3", "salary_avg" : 375000 }
{ "_id" : "ka4", "salary_avg" : 110000 }

複数の集計を同時に行う

$groupの後にフィールドを追加していくことで、複数の集計を同時に行うことができます。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
> db.employee.aggregate([
{$group: {_id:"$k_id", salary_max:{$max:"$salary"},
salary_min:{$min:"$salary"},
salary_avg:{$avg:"$salary"}}}
])
{ "_id" : "ka1", "salary_max" : 400000, "salary_min" : 400000, "salary_avg" : 400000 }
{ "_id" : "ka2", "salary_max" : 250000, "salary_min" : 250000, "salary_avg" : 250000 }
{ "_id" : "ka3", "salary_max" : 550000, "salary_min" : 200000, "salary_avg" : 375000 }
{ "_id" : "ka4", "salary_max" : 120000, "salary_min" : 100000, "salary_avg" : 110000 }

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
36
37
38
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', 'salary_max':{'$max':'$salary'}}}
])
for doc in docs:
print(doc)

# 最小値を取得
docs = db1.employee.aggregate([
{'$group': {'_id':'$k_id', 'salary_min':{'$min':'$salary'}}}
])
for doc in docs:
print(doc)

# 平均値を取得
docs = db1.employee.aggregate([
{'$group': {'_id':'$k_id', 'salary_avg':{'$avg':'$salary'}}}
])
for doc in docs:
print(doc)

# 最大値・最小値・平均値を取得
docs = db1.employee.aggregate([
{'$group': {'_id':'$k_id','salary_max':{'$max':'$salary'},
'salary_min':{'$min':'$salary'},
'salary_avg':{'$avg':'$salary'}}}
])
for doc in docs:
print(doc)

次回は、コレクション全体の集計を行います。