sql >> Databáze >  >> NoSQL >> MongoDB

Rychlý nebo hromadný upsert v pymongo

Moderní vydání pymongo (větší než 3.x) zabalují hromadné operace do konzistentního rozhraní, které přechází na nižší verzi tam, kde vydání serveru hromadné operace nepodporuje. To je nyní konzistentní v ovladačích oficiálně podporovaných MongoDB.

Preferovanou metodou kódování je tedy použití bulk_write() místo toho, kde použijete UpdateOne místo toho jinou vhodnou operaci. A nyní je samozřejmě upřednostňováno používat seznamy přirozeného jazyka spíše než konkrétní stavitel

Přímý překlad staré dokumentace:

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)

Nebo klasická smyčka transformace dokumentu:

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)

Vrácený výsledek je BulkWriteResult který bude obsahovat čítače shodných a aktualizovaných dokumentů a také vrácené _id hodnoty pro jakékoli "upserts", které se vyskytnou.

Existuje trochu mylná představa o velikosti pole hromadných operací. Skutečný požadavek odeslaný na server nemůže překročit limit 16 MB BSON, protože tento limit platí také pro „požadavek“ odeslaný na server, který také používá formát BSON.

To však neřídí velikost pole požadavků, které můžete sestavit, protože skutečné operace budou stejně odeslány a zpracovány pouze v dávkách po 1000. Jediným skutečným omezením je, že oněch 1000 operačních instrukcí samotných ve skutečnosti nevytvoří BSON dokument větší než 16 MB. Což je skutečně dost vysoký řád.

Obecnou koncepcí hromadných metod je „menší provoz“ v důsledku odesílání mnoha věcí najednou a pouze s jednou odpovědí serveru. Snížení této režie spojené s každou jednotlivou žádostí o aktualizaci šetří spoustu času.



  1. Jak ukončit platnost podřízeného klíče HSET v redis?

  2. Diagnostika neočekávaného selhání serveru redis

  3. Zaokrouhlování na 2 desetinná místa pomocí agregačního rámce MongoDB

  4. Aktualizujte vnořené vnořené dokumenty v MongoDB pomocí arrayFilters