MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Fast or Bulk Upsert w pymongo

Nowoczesne wersje pymongo (większe niż 3.x) otaczają operacje zbiorcze w spójny interfejs, który obniża wersję tam, gdzie wersja serwera nie obsługuje operacji zbiorczych. Jest to teraz spójne w oficjalnie obsługiwanych sterownikach MongoDB.

Dlatego preferowaną metodą kodowania jest użycie bulk_write() zamiast tego, gdzie używasz UpdateOne zamiast tego inne odpowiednie działania operacyjne. A teraz oczywiście lepiej jest używać list języka naturalnego niż konkretnego kreatora

Bezpośrednie tłumaczenie starej dokumentacji:

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)

Lub klasyczna pętla transformacji 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)

Zwrócony wynik to BulkWriteResult który będzie zawierał liczniki dopasowanych i zaktualizowanych dokumentów oraz zwrócony _id wartości dla wszelkich występujących „przesunięć”.

Istnieje trochę błędnego przekonania co do rozmiaru tablicy operacji zbiorczych. Rzeczywiste żądanie wysłane do serwera nie może przekroczyć limitu 16 MB BSON, ponieważ limit ten dotyczy również „żądania” wysłanego do serwera, który również używa formatu BSON.

Nie ma to jednak wpływu na rozmiar tablicy żądań, którą można zbudować, ponieważ rzeczywiste operacje i tak będą wysyłane i przetwarzane tylko w partiach po 1000. Jedynym prawdziwym ograniczeniem jest to, że te 1000 instrukcji operacyjnych nie tworzy w rzeczywistości dokumentu BSON większego niż 16 MB. Co jest rzeczywiście dość wysokim zamówieniem.

Ogólną koncepcją metod masowych jest „mniejszy ruch”, w wyniku wysyłania wielu rzeczy naraz i zajmowania się tylko jedną odpowiedzią serwera. Zmniejszenie tego narzutu związanego z każdym żądaniem aktualizacji pozwala zaoszczędzić mnóstwo czasu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose z mongodb jak zwrócić właśnie zapisany obiekt?

  2. Repozytorium Spring Data Mongo::Wspólna metoda we wszystkich wydaniach Repo

  3. PHP Mongo Błąd odczytu z gniazda

  4. Czy mogę wykonać zapytanie tekstowe za pomocą sterownika mongodb c#?

  5. Jak pogrupować datę kwartalnie?