Mémorandum de travail (pymongo) Partie 2. Fonctionnement pratique (bulk_write)

À propos de cet article

Cet article fait suite à l'article récemment publié (https://qiita.com/rsm223_rip/items/141eb146ad610215e5f7). Cette fois, j'écrirai sur bulk_write de pymongo.


Qu'est-ce que bulk_write?

Voir aussi: document pymongo 3.9.0: Opérations d'écriture en masse


Quel type d'opération est possible?

Vous pouvez utiliser les mêmes opérations que d'habitude avec les opérations suivantes.

  1. InsertOne * Plusieurs insertions sont possibles avec insert_many
  2. ReplaceOne,
  3. UpdateOne, UpdateMany,
  4. DeleteOne, DeleteMany

Mode opératoire

En gros, tout ce que vous avez à faire est de créer un objet pour chaque opération, de le mettre dans une liste et de le transmettre à la fonction bulk_write.

Ecrire normalement

main.py


from pprint import pprint
from pymongo import MongoClient
from pymongo import UpdateOne,InsertOne
from pymongo.errors import BulkWriteError

client = MongoClient()
db = client["Collection"]["table"]

#Supprimer tous les documents de la base de données
# db.delete_many({}) 

# _Insérez 1000 documents en incrémentant l'identifiant et x
opList = [ InsertOne({"_id":i,"x":i}) for i in range(0,1000)]

#Lorsque l'écriture est réussie, à partir de la valeur de retour,
#Des détails peuvent être obtenus à partir de l'erreur générée lorsqu'une exception se produit
try:    
    result = db.bulk_write(opList)
    print("À la fin de la normale")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Lorsqu'une exception se produit")
    pprint(bwe.details)
'''
{'writeErrors': [],
 'writeConcernErrors': [],
 'nInserted': 1000,
 'nUpserted': 0,
 'nMatched': 0,
 'nModified': 0,
 'nRemoved': 0,
 'upserted': []}
'''


Lors de l'écriture sans se soucier de la commande

** Spécifiez simplement order = False dans l'option bulk_write ** (Même si vous faites quelque chose d'illégal, toutes les opérations sont tentées et vous pouvez voir les détails de la valeur de retour ou de l'exception.)

main.py


# _Insérez 1000 documents en incrémentant l'identifiant et x
opList = [ InsertOne({"_id":i,"x":i}) for i in range(500,1500)]

#De la valeur de retour lorsque l'écriture est réussie, de l'erreur renvoyée lorsqu'une exception se produit
#Des détails peuvent être obtenus
try:    
    result = db.bulk_write(opList)
    print("À la fin de la normale")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Lorsqu'une exception se produit")
    pprint(bwe.details)

#Résultat de sortie
# (Vous pouvez voir que l'insertion du premier document a échoué et que l'écriture ultérieure n'a pas été possible)
'''
Lorsqu'une exception se produit
{'nInserted': 0,
 'nMatched': 0,
 'nModified': 0,
 'nRemoved': 0,
 'nUpserted': 0,
 'upserted': [],
 'writeConcernErrors': [],
 'writeErrors': [{'code': 11000,
                  'errmsg': 'E11000 duplicate key error collection: '
                            'Collection.table index: _id_ dup key: { _id: 500 '
                            '}',
                  'index': 0,
                  'keyPattern': {'_id': 1},
                  'keyValue': {'_id': 500},
                  'op': {'_id': 500, 'x': 500}}]}

'''

main.py


# _Insérez 1000 documents en incrémentant l'identifiant et x
opList = [ InsertOne({"_id":i,"x":i}) for i in range(500,1500)]

#De la valeur de retour lorsque l'écriture est réussie, de l'erreur renvoyée lorsqu'une exception se produit
#Des détails peuvent être obtenus
try:    
    result = db.bulk_write(opList,ordered=False)
    print("À la fin de la normale")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Lorsqu'une exception se produit")
    pprint(bwe.details)

#Une exception est levée, mais 500 documents peuvent être insérés,
#Vous pouvez confirmer que vous pouvez obtenir la raison de chaque échec d'écriture
'''
Lorsqu'une exception se produit
{'nInserted': 500,
 'nMatched': 0,
 'nModified': 0,
 'nRemoved': 0,
 'nUpserted': 0,
 'upserted': [],
 'writeConcernErrors': [],
 'writeErrors': [{'code': 11000,
                  'errmsg': 'E11000 duplicate key error collection: '
                            'Collection.table index: _id_ dup key: { _id: 500 '
                            '}',
                  'index': 0,
                  'keyPattern': {'_id': 1},
                  'keyValue': {'_id': 500},
                  'op': {'_id': 500, 'x': 500}},
                 {'code': 11000,
                  'errmsg': 'E11000 duplicate key error collection: '
                            'Collection.table index: _id_ dup key: { _id: 501 '
                            '}',
                  'index': 1,
                  'keyPattern': {'_id': 1},
                  'keyValue': {'_id': 501},
                  'op': {'_id': 501, 'x': 501}},
                 {'code': 11000,
                  'errmsg': 'E11000 duplicate key error collection: '
                            'Collection.table index: _id_ dup key: { _id: 502 '
                            '}',


          ~~~~Ce qui suit est omis~~~~

'''


Le bulk_write de pymongo ressemble à ceci. S'il y a une demande, j'ajouterai diverses choses.

Recommended Posts

Mémorandum de travail (pymongo) Partie 2. Fonctionnement pratique (bulk_write)
Mémorandum de travail (pymongo) Partie 1. Fonctionnement de base
Mémorandum de base Python partie 2