pymongo の最新リリース (3.x 以降) は、サーバー リリースが一括操作をサポートしていない場合にダウングレードする一貫したインターフェイスで一括操作をラップします。これは、MongoDB が公式にサポートするドライバーで一貫しています。
そのため、代わりに別の適切な操作アクションbulk_write()
を使用する代わりに使用することをお勧めします。UpdateOne
そしてもちろん、特定のビルダーよりも自然言語リストを使用することをお勧めします
古い文書の直訳:
from pymongo import UpdateOne
operations = [
UpdateOne({ "field1": 1},{ "$push": { "vals": 1 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 2 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 3 } },upsert=True)
]
result = collection.bulk_write(operations)
または、従来のドキュメント変換ループ:
import random
from pymongo import UpdateOne
random.seed()
operations = []
for doc in collection.find():
# Set a random number on every document update
operations.append(
UpdateOne({ "_id": doc["_id"] },{ "$set": { "random": random.randint(0,10) } })
)
# Send once every 1000 in batch
if ( len(operations) == 1000 ):
collection.bulk_write(operations,ordered=False)
operations = []
if ( len(operations) > 0 ):
collection.bulk_write(operations,ordered=False)
返される結果にはBulkWriteResult
、一致したドキュメントと更新されたドキュメントのカウンター、および_id
発生した「アップサート」の戻り値が含まれます。
一括操作配列のサイズについては、少し誤解があります。サーバーに送信される実際の要求は、16MB BSON 制限を超えることはできません。これは、BSON 形式を使用しているサーバーに送信される「要求」にもその制限が適用されるためです。
ただし、実際の操作は 1000 のバッチでのみ送信および処理されるため、作成できるリクエスト配列のサイズはこれで決まりません。唯一の実際の制限は、これらの 1000 の操作命令自体が実際には 16MB を超える BSON ドキュメントを作成しないことです。これは確かにかなり難しい注文です。
一括メソッドの一般的な概念は、一度に多くのものを送信し、1 つのサーバー応答のみを処理する結果として、「トラフィックが少ない」ことです。すべての更新リクエストに付随するオーバーヘッドを削減することで、多くの時間を節約できます。