MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Schnelles oder Massen-Upsert in Pymongo

Moderne Versionen von pymongo (größer als 3.x) packen Massenoperationen in eine konsistente Schnittstelle, die heruntergestuft wird, wenn die Serverversion keine Massenoperationen unterstützt. Dies ist jetzt in den von MongoDB offiziell unterstützten Treibern konsistent.

Daher ist die bevorzugte Methode zum Codieren die Verwendung von bulk_write() stattdessen, wo Sie ein UpdateOne verwenden andere andere geeignete Betriebsaktion statt dessen. Und jetzt ist es natürlich vorzuziehen, die Listen in natürlicher Sprache anstelle eines bestimmten Builders zu verwenden

Die direkte Übersetzung der alten Dokumentation:

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)

Oder die klassische Dokumenttransformationsschleife:

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)

Das zurückgegebene Ergebnis ist BulkWriteResult die Zähler für übereinstimmende und aktualisierte Dokumente sowie die zurückgegebene _id enthält Werte für alle auftretenden "Upserts".

Es gibt ein kleines Missverständnis über die Größe des Arrays für Massenoperationen. Die tatsächliche Anfrage, wie sie an den Server gesendet wird, darf die 16-MB-BSON-Grenze nicht überschreiten, da diese Grenze auch für die an den Server gesendete "Anfrage" gilt, die ebenfalls das BSON-Format verwendet.

Dies bestimmt jedoch nicht die Größe des Anforderungsarrays, das Sie erstellen können, da die eigentlichen Operationen sowieso nur in Stapeln von 1000 gesendet und verarbeitet werden. Die einzige wirkliche Einschränkung besteht darin, dass diese 1000 Betriebsanweisungen selbst kein BSON-Dokument mit mehr als 16 MB erstellen. Was in der Tat eine ziemlich große Herausforderung ist.

Das allgemeine Konzept von Bulk-Methoden ist „weniger Datenverkehr“, da viele Dinge gleichzeitig gesendet werden und nur eine Serverantwort verarbeitet wird. Die Reduzierung des Overheads, der mit jeder einzelnen Aktualisierungsanforderung verbunden ist, spart viel Zeit.