MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Upsert rapide ou en masse dans pymongo

Les versions modernes de pymongo ( supérieures à 3.x ) enveloppent les opérations en bloc dans une interface cohérente qui rétrograde là où la version du serveur ne prend pas en charge les opérations en bloc. Ceci est désormais cohérent dans les pilotes officiellement pris en charge par MongoDB.

Donc, la méthode préférée pour le codage est d'utiliser bulk_write() à la place, où vous utilisez un UpdateOne autre autre action d'opération appropriée à la place. Et maintenant bien sûr il est préférable d'utiliser les listes en langage naturel plutôt qu'un builder spécifique

La traduction directe de l'ancienne documentation :

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)

Ou la boucle de transformation de document classique :

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)

Le résultat renvoyé est de BulkWriteResult qui contiendra les compteurs de documents correspondants et mis à jour ainsi que le _id renvoyé valeurs pour tous les "upserts" qui se produisent.

Il y a un peu d'idée fausse sur la taille du tableau des opérations en bloc. La demande réelle telle qu'elle est envoyée au serveur ne peut pas dépasser la limite BSON de 16 Mo, car cette limite s'applique également à la "requête" envoyée au serveur qui utilise également le format BSON.

Cependant, cela ne régit pas la taille du tableau de requêtes que vous pouvez créer, car les opérations réelles ne seront de toute façon envoyées et traitées que par lots de 1000. La seule véritable restriction est que ces 1000 instructions d'opération elles-mêmes ne créent pas réellement un document BSON supérieur à 16 Mo. Ce qui est en effet un défi de taille.

Le concept général des méthodes en bloc est "moins de trafic", en raison de l'envoi de plusieurs choses à la fois et du traitement d'une seule réponse du serveur. La réduction de cette surcharge liée à chaque demande de mise à jour permet de gagner beaucoup de temps.