MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Бързо или насипно вдигане в pymongo

Съвременните версии на pymongo (по-големи от 3.x) обхващат груповите операции в последователен интерфейс, който се понижава, когато версията на сървъра не поддържа групови операции. Това вече е последователно в официално поддържаните драйвери на MongoDB.

Така че предпочитаният метод за кодиране е да се използва bulk_write() вместо това, където използвате UpdateOne вместо това друго подходящо действие. И сега, разбира се, се предпочита да се използват списъците с естествен език, а не конкретен конструктор

Директният превод на старата документация:

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)

Или класическия цикъл за трансформация на документ:

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)

Върнатият резултат е BulkWriteResult който ще съдържа броячи на съвпадащи и актуализирани документи, както и върнатия _id стойности за всички възникнали "прекъсвания".

Има малко погрешно схващане за размера на масива от групови операции. Действителната заявка, изпратена до сървъра, не може да надвишава ограничението от 16MB BSON, тъй като това ограничение важи и за „заявката“, изпратена до сървъра, който също използва BSON формат.

Това обаче не регулира размера на масива от заявки, който можете да изградите, тъй като действителните операции така или иначе ще бъдат изпращани и обработвани само в партиди от 1000. Единственото реално ограничение е, че самите тези 1000 инструкции за работа всъщност не създават BSON документ, по-голям от 16MB. Което наистина е доста трудна задача.

Общата концепция за груповите методи е "по-малко трафик", в резултат на изпращане на много неща наведнъж и работа само с един отговор на сървъра. Намаляването на тези допълнителни разходи, свързани с всяка отделна заявка за актуализиране, спестява много време.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да заявя mongodb с DBRef

  2. Как да изтрия n-ти елемент от масива в mongodb

  3. Как да изпращам известия с angular.js?

  4. Mongoose find(), как да получите достъп до документите с резултати?

  5. Запитване на елементи от масива с Mongo