MongoDB(32) - 一括処理(Bulk)①一括登録

今回から、一括処理(Bulk)に関する操作を行っていきます。

一括処理(Bulk)とは

大量にinsertやupdateを行う場合、一括処理(Bulk)を使うとまとめて処理を行うことができるため速く実行することができます

一括処理(Bulk)には、下記の2種類があります。

  1. 順次処理
    登録の順番に意味がある場合に使用します。
    前の処理が終わってから次の処理を行うため、2.並列処理よりも処理は遅くなります、
  2. 並列処理
    順番に関係なく処理を行います。
    そのため1.順次処理よりも速く処理が終了します。

一括登録

順次処理で一括登録を行います。

(並列処理で実行したい場合は、initializeOrderedBulkOp()ではなくinitializeUnorderedBulkOp()を使います。)

処理の詳細は以下の通りです。

  1. Bulk実行タイプを設定。(1行目)
  2. insertクエリーを設定。(3~5行目)
  3. 一括実行(Bulk実行)。(7行目)

[Mongoシェル]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> var bulk = db.member.initializeOrderedBulkOp()  //順次処理

> bulk.insert({name:"武元", age:10})
> bulk.insert({name:"松田", age:20})
> bulk.insert({name:"加藤", age:30})

> bulk.execute()
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})

> db.member.find()
{ "_id" : ObjectId("613e728c0fb0f3e6cf9e2b7e"), "name" : "武元", "age" : 10 }
{ "_id" : ObjectId("613e728c0fb0f3e6cf9e2b7f"), "name" : "松田", "age" : 20 }
{ "_id" : ObjectId("613e728c0fb0f3e6cf9e2b80"), "name" : "加藤", "age" : 30 }

問題なく3つのドキュメントを追加することができました。

Pythonで操作

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

3~4行目に新たにimport文を追加していますのでご注意下さい。

[ソースコード]

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
from pymongo import InsertOne
from pymongo.errors import BulkWriteError

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

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

# 一括更新
requests = [
InsertOne({'name':'武元', 'age':10}),
InsertOne({'name':'松田', 'age':20}),
InsertOne({'name':'加藤', 'age':30})
]

try:
db1.member.bulk_write(requests) # 順次処理
# db.member.bulk_write(requests, ordered=False) # 並列処理
except BulkWriteError as bwe:
pprint(bwe.details)

# 登録内容の確認
docs = db1.member.find()
for doc in docs:
print(doc)

次回は、一括更新処理を行います。