MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Upsert rápido ou em massa em pymongo


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.