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つのサーバー応答のみを処理する結果として、「トラフィックが少ない」ことです。すべての更新リクエストに付随するオーバーヘッドを削減することで、多くの時間を節約できます。