MongoDB(26) - 集計処理(aggregate)⑦データ数のカウント

今回は、データ数のカウントを行います。

サンプルデータ

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

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

データ数のカウント

データ数をカウントする場合は、$countを使います。

$countには表示名を指定します。

[Mongoシェル]

1
2
3
4
> db.employee.aggregate([
{$count: "employee_count"}
])
{ "employee_count" : 6 }

従業員コレクション(employee)全体のデータ数をカウントできました。

条件を指定してデータ数のカウント

$matchに検索条件を指定すると、条件を指定してのデータ数カウントができます。

30歳以上の従業員数をカウントする場合は、以下のようになります。

[Mongoシェル]

1
2
3
4
5
> db.employee.aggregate([
{$match: {age: {$gte:30}}},
{$count: "employee_count"}
])
{ "employee_count" : 5 }

グループごとのカウント

$countでは、グループごとのカウントを行うことができません。

$group$sumを使うことでグループごとのカウントを行うことができます。

ポイントは{$sum:1}とすることです。

[Mongoシェル]

1
2
3
4
5
6
7
> db.employee.aggregate([
{$group: {_id:"$k_id", employee_count:{$sum:1}}}
])
{ "_id" : "ka2", "employee_count" : 1 }
{ "_id" : "ka3", "employee_count" : 2 }
{ "_id" : "ka4", "employee_count" : 2 }
{ "_id" : "ka1", "employee_count" : 1 }

課ごとの従業員数をカウントすることができました。

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
import pymongo
from pymongo import MongoClient

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

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

# コレクション全体のカウント(従業員数)
docs = db1.employee.aggregate([
{'$count': 'employee_count'}
])
for doc in docs:
print(doc)

# 30歳以上の従業員数をカウント
docs = db1.employee.aggregate([
{'$match': {'age': {'$gte':30}}},
{'$count': 'employee_count'}
])
for doc in docs:
print(doc)

# 課ごとの従業員数をカウント
docs = db1.employee.aggregate([
{'$group': {'_id':'$k_id', 'employee_count':{'$sum':1}}}
])
for doc in docs:
print(doc)

次回は、コレクションの結合を行います。