As versões modernas do pymongo (maior que 3.x) envolvem operações em massa em uma interface consistente que faz downgrade onde a versão do servidor não oferece suporte a operações em massa. Isso agora é consistente em drivers oficialmente suportados pelo MongoDB.
Portanto, o método preferido para codificação é usar
bulk_write()
em vez disso, onde você usa um UpdateOne
outra outra ação de operação apropriada. E agora é claro que é preferível usar as listas de linguagem natural em vez de um construtor específico A tradução direta da antiga documentação:
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)
Ou o loop clássico de transformação de documentos:
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)
O resultado retornado é de
BulkWriteResult
que conterá contadores de documentos correspondentes e atualizados, bem como o _id
retornado valores para quaisquer "upserts" que ocorram. Há um pouco de equívoco sobre o tamanho da matriz de operações em massa. A solicitação real enviada ao servidor não pode exceder o limite de 16 MB BSON, pois esse limite também se aplica à "solicitação" enviada ao servidor que também está usando o formato BSON.
No entanto, isso não determina o tamanho da matriz de solicitação que você pode criar, pois as operações reais só serão enviadas e processadas em lotes de 1000 de qualquer maneira. A única restrição real é que essas 1.000 instruções de operação não criam um documento BSON maior que 16 MB. O que é realmente uma ordem bastante alta.
O conceito geral de métodos em massa é "menos tráfego", como resultado de enviar muitas coisas ao mesmo tempo e lidar apenas com uma resposta do servidor. A redução dessa sobrecarga associada a cada solicitação de atualização economiza muito tempo.