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.
Voir aussi: document pymongo 3.9.0: Opérations d'écriture en masse
Vous pouvez utiliser les mêmes opérations que d'habitude avec les opérations suivantes.
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.
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': []}
'''
** 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.