[Pytnon] pymongo で 一括処理(Bulk Method)を行う

Bulk Method を使い前は以下のようにして一件ずつ update_one で追加(更新)していました。

これを BulkMethod を使って一括で処理するようにしてやります。

initialize_ordered_bulk_op initialize_unordered_bulk_op で初期化します。

今回は initialize_unordered_bulk_op を使用します。

Bulk Method で update_one を使うには、findupsert メソッドを組み合わせるようです。

また、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 は新規に追加されたドキュメントの数です。
nMatchedfind の条件に一致したされたドキュメントの数です。
nModified は更新されたドキュメントの数です。
upserted は新規追加されたデータのインデックスと、MongoDB によって割り当てられた ID となります。

参考 URL

Hugo で構築されています。
テーマ StackJimmy によって設計されています。