sql >> Databasteknik >  >> NoSQL >> MongoDB

Snabb eller Bulk Upsert i pymongo

Moderna versioner av pymongo (större än 3.x) omsluter bulkoperationer i ett konsekvent gränssnitt som nedgraderar där serverversionen inte stöder bulkoperationer. Detta är nu konsekvent i MongoDB officiellt stödda drivrutiner.

Så den föredragna metoden för kodning är att använda bulk_write() istället, där du använder en UpdateOne annan lämplig operation istället. Och nu är det naturligtvis att föredra att använda listorna med naturliga språk snarare än en specifik byggare

Den direkta översättningen av den gamla dokumentationen:

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 klassiska dokumenttransformeringsslingan:

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 returnerade resultatet är BulkWriteResult som kommer att innehålla räknare för matchade och uppdaterade dokument samt det returnerade _id värden för eventuella "upserts" som inträffar.

Det finns lite av en missuppfattning om storleken på bulkoperationsuppsättningen. Den faktiska begäran som skickas till servern kan inte överstiga 16 MB BSON-gränsen eftersom den gränsen även gäller för "begäran" som skickas till servern som också använder BSON-format.

Det styr dock inte storleken på begäran arrayen som du kan bygga, eftersom de faktiska operationerna bara kommer att skickas och bearbetas i batcher om 1000 ändå. Den enda verkliga begränsningen är att dessa 1000 driftinstruktioner i själva verket inte skapar ett BSON-dokument som är större än 16 MB. Vilket verkligen är en ganska hög ordning.

Det allmänna konceptet med bulkmetoder är "mindre trafik", som ett resultat av att många saker skickas på en gång och bara hanterar ett serversvar. Minskningen av den overhead som är kopplad till varje enskild uppdateringsbegäran sparar mycket tid.



  1. MongoDB $replaceAll

  2. hantering av redis maxmemory situationer med rails vid användning av rails caching

  3. Redis SortedSet:Hur får man värden i numerisk ordning snarare än alfabetisk ordning när två värden har samma poäng?

  4. Fråga för dokument där matrisstorleken är större än 1