sql >> Database >  >> NoSQL >> MongoDB

Fast of Bulk Upsert in pymongo

Moderne releases van pymongo (groter dan 3.x) wikkelen bulkbewerkingen in een consistente interface die downgrades waar de serverrelease geen bulkbewerkingen ondersteunt. Dit is nu consistent in door MongoDB officieel ondersteunde stuurprogramma's.

Dus de voorkeursmethode voor codering is om bulk_write() . te gebruiken in plaats daarvan, waar u een UpdateOne . gebruikt in plaats daarvan andere andere geschikte bewerkingsacties. En nu heeft het natuurlijk de voorkeur om de natuurlijke taallijsten te gebruiken in plaats van een specifieke bouwer

De directe vertaling van de oude documentatie:

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)

Of de klassieke documenttransformatielus:

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)

Het geretourneerde resultaat is van BulkWriteResult die tellers van overeenkomende en bijgewerkte documenten zal bevatten, evenals de geretourneerde _id waarden voor eventuele "upserts" die optreden.

Er is een beetje een misvatting over de grootte van de array van bulkbewerkingen. Het daadwerkelijke verzoek dat naar de server wordt verzonden, kan de BSON-limiet van 16 MB niet overschrijden, aangezien die limiet ook van toepassing is op het "verzoek" dat naar de server wordt verzonden die ook de BSON-indeling gebruikt.

Dat is echter niet van invloed op de grootte van de aanvraagarray die u kunt bouwen, omdat de daadwerkelijke bewerkingen sowieso alleen in batches van 1000 worden verzonden en verwerkt. De enige echte beperking is dat die 1000 bedieningsinstructies zelf niet echt een BSON-document creëren dat groter is dan 16 MB. Dat is inderdaad een behoorlijk lange bestelling.

Het algemene concept van bulkmethoden is "minder verkeer", omdat er veel dingen tegelijk worden verzonden en er slechts één serverreactie is. De vermindering van die overhead die aan elk afzonderlijk updateverzoek is verbonden, bespaart veel tijd.



  1. Hoe ML-modellen in productie te zetten

  2. MongoDB 4.2 Beheer &Monitoring Zonder Vendor Lockin

  3. Mongodb-hotfix KB2731284

  4. Mongoes findOneAndUpdate Upsert _id null?