sql >> Database teknologi >  >> NoSQL >> MongoDB

Fast eller Bulk Upsert i pymongo

Moderne udgivelser af pymongo (større end 3.x) ombryder masseoperationer i en ensartet grænseflade, der nedgraderer, hvor serverudgivelsen ikke understøtter masseoperationer. Dette er nu konsekvent i MongoDB officielt understøttede drivere.

Så den foretrukne metode til kodning er at bruge bulk_write() i stedet, hvor du bruger en UpdateOne anden anden passende operationshandling i stedet. Og nu foretrækkes det selvfølgelig at bruge de naturlige sproglister frem for en specifik builder

Den direkte oversættelse af den gamle 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)

Eller den klassiske dokumenttransformationsløkke:

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)

Det returnerede resultat er BulkWriteResult som vil indeholde tællere for matchede og opdaterede dokumenter samt den returnerede _id værdier for eventuelle "upserts", der forekommer.

Der er lidt en misforståelse om størrelsen af ​​bulk operations-arrayet. Den faktiske anmodning, som sendes til serveren, må ikke overstige 16 MB BSON-grænsen, da denne grænse også gælder for den "anmodning", der sendes til serveren, som også bruger BSON-format.

Det bestemmer dog ikke størrelsen af ​​det forespørgselsarray, som du kan bygge, da de faktiske operationer alligevel kun vil blive sendt og behandlet i batches på 1000. Den eneste reelle begrænsning er, at disse 1000 betjeningsinstruktioner i sig selv faktisk ikke opretter et BSON-dokument, der er større end 16MB. Hvilket faktisk er en ret høj ordre.

Det generelle koncept for bulk-metoder er "mindre trafik", som et resultat af at sende mange ting på én gang og kun handler om et serversvar. Reduktionen af ​​den overhead, der er knyttet til hver enkelt opdateringsanmodning, sparer masser af tid.



  1. Mongoose Schema er ikke blevet registreret for model

  2. MongoDB SSL med selvsignerede certifikater i C#

  3. php-redis - Er der en måde at gemme PHP-objekt i Redis uden at serialisere det?

  4. Hvis redis allerede er en del af stakken, hvorfor bruges Memcached så stadig sammen med Redis?