pymongo 的现代版本(高于 3.x )将批量操作包装在一致的接口中,该接口会在服务器版本不支持批量操作的情况下降级。这在 MongoDB 官方支持的驱动程序中现在是一致的。
所以编码的首选方法是使用bulk_write() https://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write相反,当你使用UpdateOne https://api.mongodb.org/python/current/api/pymongo/operations.html#pymongo.operations.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 https://api.mongodb.org/python/current/api/pymongo/results.html#pymongo.results.BulkWriteResult其中将包含匹配和更新文档的计数器以及返回的文档_id
发生的任何“更新插入”的值。
关于批量操作数组的大小存在一些误解。发送到服务器的实际请求不能超过 16MB BSON 限制,因为该限制也适用于发送到使用 BSON 格式的服务器的“请求”。
然而,这并不决定您可以构建的请求数组的大小,因为实际操作无论如何都只会以 1000 个批次的形式发送和处理。唯一真正的限制是,这 1000 个操作指令本身实际上并不会创建大于 16MB 的 BSON 文档。这确实是一个相当艰巨的任务。
批量方法的一般概念是“更少的流量”,因为一次发送许多内容并且只处理一个服务器响应。减少每个更新请求的开销可以节省大量时间。