MongoDB(23) - 集計処理(aggregate)④集計前後に検索

今回は、集計の前後に検索を行ってみます。

サンプルデータ

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

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

集計後に検索

集計後に検索を行います。

具体的には①課ごとに給料合計を集計し、②総務課を抽出します。

groupにフィールドを指定する場合はフィールド名の先頭に$を付けますが、matchにフィールドを指定する場合はフィールド名の先頭に$をつける必要はありません。

[Mongoシェル]

1
2
3
4
5
6
> db.employee.aggregate([
{$group: {_id:"$k_id", salary_total:{$sum:"$salary"}}},
{$match: {_id:"ka1"}},
])

> { "_id" : "ka1", "salary_total" : 400000 }

集計結果への検索を行うことができました。

集計の前後に検索

集計前と集計後に検索を行います。

具体的には①30歳以上の従業員を検索し、②課ごとに給料合計を集計し、③開発1課を抽出します。

[Mongoシェル]

1
2
3
4
5
6
7
>  db.employee.aggregate([
{$match: {age:{$gte: 30}}},
{$group: {_id:"$k_id", salary_total:{$sum:"$salary"}}},
{$match: {_id:"ka3"}},
])

> { "_id" : "ka3", "salary_total" : 550000 }

集計の前と後に検索を行うことができました。

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
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_total':{'$sum':'$salary'}}},
{'$match': {'_id': 'ka1'}}
])
for doc in docs:
print(doc)

# ①30歳以上の従業員
# ②課ごとに給料合計を集計
# ③開発1課を抽出
docs = db1.employee.aggregate([
{'$match': {'age': {'$gte':30}}},
{'$group':{'_id':'$k_id', 'salary_total':{'$sum':'$salary'}}},
{'$match': {'_id': 'ka3'}}
])
for doc in docs:
print(doc)

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