ailog.site Open in urlscan Pro
151.101.65.195  Public Scan

Submitted URL: http://ailog.site/
Effective URL: https://ailog.site/
Submission: On September 10 via manual from JP — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

Home Archives Tags

24分前 6分 read (About 831 words)


MONGODB(28) - 集計処理(AGGREGATE)⑨コレクション結合・オブジェクト型と文字列型に展開

今回は、結合したコレクションをオブジェクト型と文字列型に展開します。


サンプルデータ

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

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


オブジェクト型に変換

前回のコレクション結合では、結合先コレクションのdivision_docsが [{}] というように配列の中にオブジェクトが入っている構造になっています。

$unwindを使うと、配列の中の値を展開することができます。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


> db.employee.aggregate([
     {$lookup:{
         from: "division",
         localField:"k_id",
         foreignField:"k_id",
         as: "division_docs"
     }},
     {$project:{
         "_id":0,
         "name":1,
         "division_docs.name":1
     }},
     {$unwind:"$division_docs"}
 ])
{ "name" : "高山", "division_docs" : { "name" : "総務課" } }
{ "name" : "生駒", "division_docs" : { "name" : "企画課" } }
{ "name" : "嘉喜", "division_docs" : { "name" : "開発1課" } }
{ "name" : "与田", "division_docs" : { "name" : "開発2課" } }
{ "name" : "松田", "division_docs" : { "name" : "開発1課" } }
{ "name" : "菅井", "division_docs" : { "name" : "開発2課" } }


division_docsの[]がとれて、{}というオブジェクト型になりました。


文字列型に変換

次にオブジェクト型を文字列型に変換します。

オブジェクト型に変換したデータに対して$groupを使い_id(集計キー)にe_id(従業員ID)を指定します。

e_idはユニークなので集計されません。

さらに表示したいフィールドに何らかの集計関数(maxなど)を使って、オブジェクト型から文字列型に変換します。

[Mongoシェル]

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


> db.employee.aggregate([
     {$lookup:{
         from: "division",
         localField:"k_id",
         foreignField:"k_id",
         as: "division_docs"
     }},
     {$project:{
         "_id":0,
         "e_id":1,
         "name":1,
         "division_docs.name":1
     }},
     {$unwind:"$division_docs"},
     {$group:{
         _id:"$e_id",
         employeeName:{$max:"$name"},
         divisionName:{$max:"$division_docs.name"}
     }}
 ])
{ "_id" : "emp002", "employeeName" : "生駒", "divisionName" : "企画課" }
{ "_id" : "emp001", "employeeName" : "高山", "divisionName" : "総務課" }
{ "_id" : "emp004", "employeeName" : "与田", "divisionName" : "開発2課" }
{ "_id" : "emp006", "employeeName" : "菅井", "divisionName" : "開発2課" }
{ "_id" : "emp005", "employeeName" : "松田", "divisionName" : "開発1課" }
{ "_id" : "emp003", "employeeName" : "嘉喜", "divisionName" : "開発1課" }


結合した課コレクションの課の名称(division_docs.name)を、オブジェクト型から文字列型に変換することができました。

少々強引な方法なので、アプリケーション側で処理した方が楽に展開できるかもしれません。


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
39
40
41
42
43
44
45
46
47
48
49
50


import pymongo
from pymongo import MongoClient

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

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

# コレクションの結合(オブジェクト型に展開)
docs = db1.employee.aggregate([
             {'$lookup':{
                 'from': 'division',
                 'localField':'k_id',
                 'foreignField':'k_id',
                 'as': 'division_docs'
             }},
             {'$project':{
                 '_id':0,
                 'name':1,
                 'division_docs.name':1
             }},
             {'$unwind':'$division_docs'}
            ])
for doc in docs:
    print(doc)

# コレクションの結合(文字列型に展開)
docs = db1.employee.aggregate([
             {'$lookup':{
                 'from': 'division',
                 'localField':'k_id',
                 'foreignField':'k_id',
                 'as': 'division_docs'
             }},
             {'$project':{
                 '_id':0,
                 'e_id':1,
                 'name':1,
                 'division_docs.name':1
             }},
             {'$unwind':'$division_docs'},
             {'$group':{
                 '_id':'$e_id',
                 'employeeName':{'$max':'$name'},
                 'divisionName':{'$max':'$division_docs.name'}
             }}
           ])
for doc in docs:
    print(doc)


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

1日前 6分 read (About 896 words)


MONGODB(27) - 集計処理(AGGREGATE)⑧コレクション結合

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


サンプルデータ

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

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


コレクションの結合

$lookupを使うと、コレクションの結合を行うことができます。

従業員コレクション(employee)と課コレクション(division)を結合します。

設定値の意味は下記の通りです。

 * from
   結合先のコレクション名
 * localField
   結合元のフィールド名
 * foreignField
   結合先のフィールド名
 * as
   結合先コレクションの別名

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14


> db.employee.aggregate([
     {$lookup:{
         from: "division",
         localField:"k_id",
         foreignField:"k_id",
         as: "division_docs"
     }}
 ])
{ "_id" : ObjectId("612f07f568110fe533ed9d21"), "e_id" : "emp001", "k_id" : "ka1", "p_id" : "po1", "name" : "高山", "age" : 31, "salary" : 400000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d19"), "k_id" : "ka1", "b_id" : "bu1", "name" : "総務課" } ] }
{ "_id" : ObjectId("612f07f568110fe533ed9d22"), "e_id" : "emp002", "k_id" : "ka2", "p_id" : "po2", "name" : "生駒", "age" : 37, "salary" : 250000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d1a"), "k_id" : "ka2", "b_id" : "bu2", "name" : "企画課" } ] }
{ "_id" : ObjectId("612f07f568110fe533ed9d23"), "e_id" : "emp003", "k_id" : "ka3", "p_id" : "po3", "name" : "嘉喜", "age" : 23, "salary" : 200000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d1b"), "k_id" : "ka3", "b_id" : "bu3", "name" : "開発1課" } ] }
{ "_id" : ObjectId("612f07f568110fe533ed9d24"), "e_id" : "emp004", "k_id" : "ka4", "p_id" : "po4", "name" : "与田", "age" : 33, "salary" : 100000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d1c"), "k_id" : "ka4", "b_id" : "bu3", "name" : "開発2課" } ] }
{ "_id" : ObjectId("612f07f568110fe533ed9d25"), "e_id" : "emp005", "k_id" : "ka3", "p_id" : "po4", "name" : "松田", "age" : 35, "salary" : 550000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d1b"), "k_id" : "ka3", "b_id" : "bu3", "name" : "開発1課" } ] }
{ "_id" : ObjectId("612f07f568110fe533ed9d26"), "e_id" : "emp006", "k_id" : "ka4", "p_id" : "po4", "name" : "菅井", "age" : 45, "salary" : 120000, "division_docs" : [ { "_id" : ObjectId("612f07b568110fe533ed9d1c"), "k_id" : "ka4", "b_id" : "bu3", "name" : "開発2課" } ] }


“division_docs”という配列のデータが、結合したコレクションから取得したデータになります。


結合したコレクションの表示フィールドを絞る

$projectを使うと、結合したコレクションの表示フィールドを絞って表示することができます。

_idを非表示にして、従業員コレクションのnameと課コレクションのnameだけを表示してみます。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


> db.employee.aggregate([
     {$lookup:{
         from: "division",
         localField:"k_id",
         foreignField:"k_id",
         as: "division_docs"
     }},
     {$project:{
         "_id":0,
         "name":1,
         "division_docs.name":1
     }}
 ])
{ "name" : "高山", "division_docs" : [ { "name" : "総務課" } ] }
{ "name" : "生駒", "division_docs" : [ { "name" : "企画課" } ] }
{ "name" : "嘉喜", "division_docs" : [ { "name" : "開発1課" } ] }
{ "name" : "与田", "division_docs" : [ { "name" : "開発2課" } ] }
{ "name" : "松田", "division_docs" : [ { "name" : "開発1課" } ] }
{ "name" : "菅井", "division_docs" : [ { "name" : "開発2課" } ] }


指定した通りのフィールドを表示することができました。


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


import pymongo
from pymongo import MongoClient

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

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

# コレクションの結合
docs = db1.employee.aggregate([
             {'$lookup':{
                 'from': 'division',
                 'localField':'k_id',
                 'foreignField':'k_id',
                 'as': 'division_docs'
             }}
            ])
for doc in docs:
    print(doc)

# 結合したコレクションの表示フィールドを絞る
docs = db1.employee.aggregate([
             {'$lookup':{
                 'from': 'division',
                 'localField':'k_id',
                 'foreignField':'k_id',
                 'as': 'division_docs'
             }},
             {'$project':{
                 '_id':0,
                 'name':1,
                 'division_docs.name':1
             }}
           ])
for doc in docs:
    print(doc)


次回は、結合したコレクションをオブジェクト型と文字列型に展開します。

2日前 4分 read (About 577 words)


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)


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

3日前 2分 read (About 329 words)


MONGODB(25) - 集計処理(AGGREGATE)⑥コレクション全体の集計

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


サンプルデータ

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

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


コレクション全体の集計

$groupを使って、コレクション全体の集計を行うことができます。

コレクション全体の集計を行うためには_idにnullを指定します。

[Mongoシェル]

1
2
3
4


> db.employee.aggregate([
...     {$group: {_id:null, total:{$sum:"$salary"}}}
... ])
{ "_id" : null, "total" : 1620000 }


従業員コレクション(employee)全体の給料合計を集計することができました。


PYTHONで操作

上記の集計処理をPythonで行うと、次のようになります。

pythonではnullの代わりにNoneを指定します。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


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


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

4日前 4分 read (About 567 words)


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)


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

5日前 4分 read (About 543 words)


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)


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

6日前 4分 read (About 670 words)


MONGODB(22) - 集計処理(AGGREGATE)③合計(SUM)+条件(MATCH)

今回は、検索条件に年齢を加えて集計を行います。


サンプルデータ

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

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


検索条件を追加して課ごとの給料合計

集計時の検索条件を追加する場合は$matchを使います。

従業員コレクション(employee)から、年齢が35歳以上の従業員を対象として課ごとの給料合計を表示します。

[Mongoシェル]

1
2
3
4
5
6
7


> db.employee.aggregate([
     {$match: {age: {$gte:35}}},
     {$group:{_id:"$k_id", salary_total:{$sum:"$salary"}}}
  ])
{ "_id" : "ka3", "salary_total" : 550000 }
{ "_id" : "ka4", "salary_total" : 120000 }
{ "_id" : "ka2", "salary_total" : 250000 }


35歳以上の従業員の給料合計を、課ごとに集計できました。


GROUPとMATCHの順番を入れ替える

$groupと$matchの順番は入れ替えることができます。

先ほど実行した集計に関して、$groupと$matchの順番を入れ替えて実行してみます。

[Mongoシェル]

1
2
3
4
5
6


> db.employee.aggregate([
     {$group:{_id:"$k_id", salary_total:{$sum:"$salary"}}},
     {$match: {age: {$gte:35}}}
  ])

>


何も結果が返ってきませんでした。どうしてでしょうか。


理由は、aggregateではクエリーを上から順番に実行しているためです。

まず、$groupで課ごとに集計作業が実行されて_idとsalary_totalのフィールドのみの結果になります。
次にageフィールドで検索を行っても、ageフィールドがないため検索結果がないということになります。

$groupと$matchは順番を変えたり、複数回指定することが可能ですが、その順番には気を付けましょう。


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


import pymongo
from pymongo import MongoClient

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

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

# ①年齢が35歳以上の従業員
# ②課ごとの給料合計表示
docs = db1.employee.aggregate([
            {'$match': {'age': {'$gte':35}}},
            {'$group':{'_id':'$k_id', 'salary_total':{'$sum':'$salary'}}}])
for doc in docs:
    print(doc)

# ①課ごとの給料合計算出
# ②年齢が35歳以上の従業員
docs = db1.employee.aggregate([
            {'$group':{'_id':'$k_id', 'salary_total':{'$sum':'$salary'}}},
            {'$match': {'age': {'$gte':35}}}])
for doc in docs:
    print(doc)


次回は、集計した結果に対して検索を行います。

7日前 4分 read (About 592 words)


MONGODB(21) - 集計処理(AGGREGATE)②合計($SUM)

今回は、簡単な集計として従業員の課ごとの給料合計を集計してみます。


サンプルデータ

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

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


課ごとの給料合計

指定したフィールドで集計を行うためにはaggregateの引数に$groupを指定し、集計条件を設定します。

合計を表示するためには$sumを集計条件に指定します。

従業員コレクション(employee)から、課ごとの給料合計を表示してみます。

[Mongoシェル]

1
2
3
4
5
6
7


> db.employee.aggregate([
    {$group:{_id:"$k_id", salary_total:{$sum:"$salary"}}}
  ])
{ "_id" : "ka1", "salary_total" : 400000 }
{ "_id" : "ka3", "salary_total" : 750000 }
{ "_id" : "ka4", "salary_total" : 220000 }
{ "_id" : "ka2", "salary_total" : 250000 }


集計条件の設定内容は以下の通りです。

 * _idに指定したフィールド($k_id)で集計を行います。
   フィールドは“$フィールド名”と先頭に$を追加して指定します。
   SQLだと[ group by k_id ]の意味です。
 * salary_totalは集計結果のフィールド名です。
   SQLだと[ select salary_total ]の意味です。
 * 集計関数として$sumを指定し、集計するフィールドは“$フィールド名”と先頭に$を追加して設定します。
   SQLだと[ sum(salary) ]の意味です。

SQLに慣れている人ですと、フィールド名の先頭に$をつけたり、記述がやや込み入って見えたりするかもしれませんが、1つ1つ対応関係を確認すれば読み解けるかと思います。


PYTHONで操作

上記の集計処理をPythonで行うと、次のようになります。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13


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'}}}])
for doc in docs:
    print(doc)


次回は、検索条件に年齢を加えて集計を行います。

8日前 6分 read (About 879 words)


MONGODB(20) - 集計処理(AGGREGATE)①データ準備

今回から、MongoDBでの集計処理(aggretate)を行っていきます。

今回は前準備として集計動作確認用のデータを作成します。


サンプルデータ

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

データのイメージは次の通りです。

 * 課は1つの部に所属します。
 * 従業員は1つの課に所属します。
 * 従業員は1つの役職を持ちます。


部のデータ作成

部のデータを作成します。コレクション名はdepartmentです。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


> db.department.insertMany([
     {b_id:"bu1", name:"総務部"},
     {b_id:"bu2", name:"企画部"},
     {b_id:"bu3", name:"開発部"}
 ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("612f075468110fe533ed9d16"),
                ObjectId("612f075468110fe533ed9d17"),
                ObjectId("612f075468110fe533ed9d18")
        ]
}

> db.department.find({}, {_id:0})
{ "b_id" : "bu1", "name" : "総務部" }
{ "b_id" : "bu2", "name" : "企画部" }
{ "b_id" : "bu3", "name" : "開発部" }



課のデータ作成

課のデータを作成します。コレクション名はdivisionです。

b_idフィールドは所属する部署を表します。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


> db.division.insertMany([
     {k_id:"ka1", b_id:"bu1", name:"総務課"},
     {k_id:"ka2", b_id:"bu2", name:"企画課"},
     {k_id:"ka3", b_id:"bu3", name:"開発1課"},
     {k_id:"ka4", b_id:"bu3", name:"開発2課"}
 ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("612f07b568110fe533ed9d19"),
                ObjectId("612f07b568110fe533ed9d1a"),
                ObjectId("612f07b568110fe533ed9d1b"),
                ObjectId("612f07b568110fe533ed9d1c")
        ]
}

> db.division.find({}, {_id:0})
{ "k_id" : "ka1", "b_id" : "bu1", "name" : "総務課" }
{ "k_id" : "ka2", "b_id" : "bu2", "name" : "企画課" }
{ "k_id" : "ka3", "b_id" : "bu3", "name" : "開発1課" }
{ "k_id" : "ka4", "b_id" : "bu3", "name" : "開発2課" }



役職のデータ作成

役職のデータを作成します。コレクション名はpositionです。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


> db.position.insertMany([
     {p_id:"po1", name:"社長"},
     {p_id:"po2", name:"部長"},
     {p_id:"po3", name:"課長"},
     {p_id:"po4", name:"一般社員"}
 ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("612f07d768110fe533ed9d1d"),
                ObjectId("612f07d768110fe533ed9d1e"),
                ObjectId("612f07d768110fe533ed9d1f"),
                ObjectId("612f07d768110fe533ed9d20")
        ]
}

> db.position.find({}, {_id:0})
{ "p_id" : "po1", "name" : "社長" }
{ "p_id" : "po2", "name" : "部長" }
{ "p_id" : "po3", "name" : "課長" }
{ "p_id" : "po4", "name" : "一般社員" }



従業員のデータ作成

従業員のデータを作成します。コレクション名はemployeeです。

k_idフィールドは所属する課を表し、p_idは役職を表します。

[Mongoシェル]

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


> db.employee.insertMany([
     {e_id:"emp001", k_id:"ka1", p_id:"po1", name:"高山", age:31, salary:400000},
     {e_id:"emp002", k_id:"ka2", p_id:"po2", name:"生駒", age:37, salary:250000},
     {e_id:"emp003", k_id:"ka3", p_id:"po3", name:"嘉喜", age:23, salary:200000},
     {e_id:"emp004", k_id:"ka4", p_id:"po4", name:"与田", age:33, salary:100000},
     {e_id:"emp005", k_id:"ka3", p_id:"po4", name:"松田", age:35, salary:550000},
     {e_id:"emp006", k_id:"ka4", p_id:"po4", name:"菅井", age:45, salary:120000}
 ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("612f07f568110fe533ed9d21"),
                ObjectId("612f07f568110fe533ed9d22"),
                ObjectId("612f07f568110fe533ed9d23"),
                ObjectId("612f07f568110fe533ed9d24"),
                ObjectId("612f07f568110fe533ed9d25"),
                ObjectId("612f07f568110fe533ed9d26")
        ]
}

> db.employee.find({}, {_id:0})
{ "e_id" : "emp001", "k_id" : "ka1", "p_id" : "po1", "name" : "高山", "age" : 31, "salary" : 400000 }
{ "e_id" : "emp002", "k_id" : "ka2", "p_id" : "po2", "name" : "生駒", "age" : 37, "salary" : 250000 }
{ "e_id" : "emp003", "k_id" : "ka3", "p_id" : "po3", "name" : "嘉喜", "age" : 23, "salary" : 200000 }
{ "e_id" : "emp004", "k_id" : "ka4", "p_id" : "po4", "name" : "与田", "age" : 33, "salary" : 100000 }
{ "e_id" : "emp005", "k_id" : "ka3", "p_id" : "po4", "name" : "松田", "age" : 35, "salary" : 550000 }
{ "e_id" : "emp006", "k_id" : "ka4", "p_id" : "po4", "name" : "菅井", "age" : 45, "salary" : 120000 }


以上で、集計動作確認用のデータの準備ができました。


次回は、簡単な集計として従業員の課ごとの給料合計を集計してみます。

9日前 4分 read (About 632 words)


MONGODB(19) - ドキュメント削除編

今回は、ドキュメントの削除を行います。


サンプルデータ

次のようなデータをcol1コレクションに設定します。

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


> db.col1.insertMany([{name:"白石", age:29},
                      {name:"嘉喜", age:19},
                      {name:"西野", age:28},
                      {name:"武元", age:5}])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("612d8ecb86b5a5660ce2fd20"),
                ObjectId("612d8ecb86b5a5660ce2fd21"),
                ObjectId("612d8ecb86b5a5660ce2fd22"),
                ObjectId("612d8ecb86b5a5660ce2fd23")
        ]
}

> db.col1.find()
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd20"), "name" : "白石", "age" : 29 }
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd21"), "name" : "嘉喜", "age" : 19 }
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd22"), "name" : "西野", "age" : 28 }
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd23"), "name" : "武元", "age" : 5 }



1件削除

ドキュメントを1件削除する場合は、deleteOneを使います。

第1引数に検索条件を指定します。

[Mongoシェル]

1
2
3
4
5
6
7


> db.col1.deleteOne({name:"西野"})
{ "acknowledged" : true, "deletedCount" : 1 }

> db.col1.find()
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd20"), "name" : "白石", "age" : 29 }
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd21"), "name" : "嘉喜", "age" : 19 }
{ "_id" : ObjectId("612d8ecb86b5a5660ce2fd23"), "name" : "武元", "age" : 5 }


nameが”西野”のドキュメントだけが削除されました。

もし検索条件に複数のドキュメントが一致しても、削除されるのは1件のみとなります。


複数削除

ドキュメントを複数削除する場合は、deleteManyを使います。

第1引数に検索条件を指定します。

今回は、検索条件を指定せずに全件削除してみます。

[Mongoシェル]

1
2
3
4


> db.col1.deleteMany({})
{ "acknowledged" : true, "deletedCount" : 3 }

> db.col1.find()


問題なく全件削除されました。

コレクション内のドキュメントを全件削除する場合は、deleteOneや一括高速処理のBulkで削除するよりもコレクション自体を削除したほうが速いとのことなので、コレクション名.drop()の方を使いましょう。


PYTHONで操作

上記の更新処理をPythonで行うと、次のようになります。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


import pymongo
from pymongo import MongoClient

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

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

# 1件削除
db1.col1.delete_one({'name':'西野'})

# 結果表示
for doc in db1.col1.find():
    print(doc)

# 複数削除
db1.col1.delete_many({})

# 結果表示
for doc in db1.col1.find():
    print(doc)


次回は、データの集計(aggregate)を行います。

前
次
 * 1
 * 2
 * …
 * 75


最近の記事

2021-09-10
MongoDB(28) - 集計処理(aggregate)⑨コレクション結合・オブジェクト型と文字列型に展開



2021-09-09
MongoDB(27) - 集計処理(aggregate)⑧コレクション結合



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



2021-09-07
MongoDB(25) - 集計処理(aggregate)⑥コレクション全体の集計



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




アーカイブ

 * 2021-09 10
 * 2021-08 31
 * 2021-07 31
 * 2021-06 30
 * 2021-05 31
 * 2021-04 30
 * 2021-03 31
 * 2021-02 28
 * 2021-01 31
 * 2020-12 31
 * 2020-11 30
 * 2020-10 31
 * 2020-09 30
 * 2020-08 31
 * 2020-07 31
 * 2020-06 30
 * 2020-05 31
 * 2020-04 30
 * 2020-03 31
 * 2020-02 29
 * 2020-01 31
 * 2019-12 16
 * 2019-11 24
 * 2019-10 31
 * 2019-09 29
 * 2019-08 23



タグ

ACKTR 16
AlphaZero 16
Amazon 1
AnyTrading 207
BeautifulSoup 3
BitSend 1
Bitcoin 1
Bokeh 1
Bootstrap 1
CSV 1
Chrome 1
Chromeリモートデスクトップ 1
Chrome拡張 1
Colaboratory 1
ETL 1
Ethereum 59
Excel 2
FX 2
Firefox Send 1
Flask 1
GEM 1
GVGAI GYM 1
GigaFile便 1
Gym Retro 3
GymFC 1
GymGo 1
IME 2
Image 1
IoT 13
Kaggle 63
Keras 1
Kindle 1
LightGBM 6
Logger 1
Matplotlib 1
Mist Wallet 2
MistWallet 11
MongoDB 28
NEO 4
Neural Network 6
Numpy 7
Obstacle Tower 1
OpenAI Gym 56
OpenCV 4
Optuna 1
OrderedDict 1
PPO(PPO2) 2
PPO2 1
Pandas 4
Parallel Game Engine 1
PoW 1
PyAutoGUI 1
PyBullet 2
PyTorch 9
Python 512
RPA 26
RandomForest 16
ReportLab 1
ResNet 1
Selenium 1
Sikuli 38
SikuliX 1
Solidity 4
Stable Baselines 3
Stable Baselines Zoo 41
TensorBoard 3
TensorFlow 8
Tensorflow 1
Tex 1
Twitter 1
USB PD 1
Ubuntu 2
Unity ML-Agents 5
WSL 4
WatchDog 2
Win10 2
Windows 4
XML 1
Yahoo 1
atari 2
chainer 13
chainer-gogh 1
csv 2
dircmp 1
epub 1
fabric 1
firestorage 1
geth 19
gym-city 1
gym-donkeycar 1
gym-duckietown 1
gym-gazebo 1
gym-maze 1
gym-minigrid 2
gym-miniworld 1
json 1
matplotlib 7
matplotlib basemap 1
numpy 7
osim-rl 1
pandas 1
paramiko 2
pdfminer3k 1
pynput 2
pyocr 1
scikit-learn 6
scp 1
sklearn 1
solidity 34
twitter 1
wordpress 1
yaml 2
インターネット 1
イーサリアム 37
エクスプローラ 1
オープンソース 6
カスタムGym 26
クラスタリング 1
クロスバリデーション 1
サトシナカモト 1
ショートカット 2
ショートカットキー 3
スクレイピング 1
スマートコントラクト 46
ソフトフォーク 1
デジタル化 1
ネットプリント 1
ハッシュパワー 1
ハッシュレート 1
ハッシュ値 1
ハードフォーク 1
パソコン高速化 3
ビットコイン 12
ファイル転送サービス 1
フリー素材 1
ブルームフィルタ 1
ブロックチェーン 44
マイニング 1
ミラーリング 1
メディア寿命 1
ロック解除 1
分類 1
動画 1
回帰 1
完全無料RPA 22
定額動画配信 1
強化学習 26
採掘難易度 1
文字種判定 1
日本語入力 1
機械学習 3
比較 1
無料 1
無料サイト 1
無料ツール 8
画像取得 1
見逃し配信 1
語学学習 1
運用管理ツール 2
電子署名 1
音楽素材 1

© 2021 Owl  Powered by Hexo & Icarus



YOUR BROWSER IS OUT-OF-DATE!

Update your browser to view this website correctly. Update my browser now

×


投稿
Sikuli - 例外処理

合致しなかったときの例外処理Sikuliでは画像が見つからなかった時に例外が発生し、プログラムが停止します。これを防ぐ方法としてまず考えられるのが、existsメソッドを使う方法です。existsメソッドを使ってあらかじめ画像が存在するかどうかを確認し、存在するならばクリックするようにプログラミング

Sikuli - マウス移動の高速化

実際にSikuliでの動作を確認すると気づきますが、マウスポインタの動きは低速です。(ロボットが頑張って動いている感じがしてやや面白いのですが。。)
これはマウスポインタの移動に対して、ウェイトがかかっているためです。このウェイトは Settings.MoveMouseDelay で設定できます。

Sikuli - ダイアログの表示位置を設定する

ダイアログはデフォルトで画面中央に表示されますが、popatメソッドを使用するとダイアログの表示位置を変更することができます。
popatメソッドの引数にx,y座標を指定することができるとのことですが私の環境ではエラーになってしまいました。動作確認ができたLocation指定のコードは下記の通りです

Sikuli - マウスホイールでスクロールする

Sikuliではマウスホイールでスクロールするための関数 wheel が用意されています。 wheel関数の引数は3つあります、 Regionオブジェクト
マウスホイールのアップ・ダウン 移動数 以下の例ではフォーカスのあるウィンドウでマウスホイールを5回分ダウンさせたあとに、5回分アップさせます。

Sikuli - 複数個所を連続して選択する

Regionオブジェクトのfindメソッドを使うと、引数に指定した画像をRegionオブジェクトの内部から探し最も合致した一か所を返します。
findAllメソッドを使うと合致した全ての箇所をリストとして返します。このfindAllメソッドを使うとチェックボックスをすべてクリックするといった操作を行

タグ
完全無料RPA完全無料RPA
SikuliSikuli
twittertwitter
FXFX
wordpresswordpress