Bulk Method を使い前は以下のようにして一件ずつ update_one で追加(更新)していました。
これを BulkMethod を使って一括で処理するようにしてやります。
initialize_ordered_bulk_op initialize_unordered_bulk_op で初期化します。
今回は initialize_unordered_bulk_op を使用します。
Bulk Method で update_one を使うには、find と upsert メソッドを組み合わせるようです。
また、update_one で3件のデータを追加(更新)する
まずは処理しやすくするためにサンプルデータを配列で用意しました。
sample_data = []
for i in range(3):
sample_data.append({
'filter': {
'camera_id': "1",
'detected_id': str(start_id + i + 1),
},
'update': {
'label': 'person',
'captured_at': captured_at.isoformat(),
'disappeared_at': captured_at.isoformat(),
'thumbnail': None
}
})
上記のデータについて、例えば以下のように処理します。
from pymongo import MongoClient,
client = MongoClient('mongodb://localhost:27017/')
db = client['dbname']
col = db['col_name']
bulk = col.initialize_unordered_bulk_op()
for data in sample_data:
bulk.find(data['filter']).upsert().update_one({ '$setOnInsert': data['update'] })
result = bulk.execute()
$setOnInsert については以下のページが参考になりました。
レスポンスは以下のようなデータが返ってきます。
{
'writeErrors': [],
'writeConcernErrors': [],
'nInserted': 0,
'nUpserted': 2,
'nMatched': 1,
'nModified': 0,
'nRemoved': 0,
'upserted': [
{
'index': 1,
'_id': ObjectId('635878690bdc2e90f9e0e8bf')
},
{
'index': 2,
'_id': ObjectId('63588e750bdc2e90f9e0f1f2')
}
]
}
nUpserted は新規に追加されたドキュメントの数です。nMatched は find の条件に一致したされたドキュメントの数です。nModified は更新されたドキュメントの数です。upserted は新規追加されたデータのインデックスと、MongoDB によって割り当てられた ID となります。