[PYTHON] Arbeitsmemorandum (Pymongo) Teil 2. Bequemer Betrieb (Bulk_write)

Über diesen Artikel

Dieser Artikel ist eine Fortsetzung des kürzlich veröffentlichten Artikels (https://qiita.com/rsm223_rip/items/141eb146ad610215e5f7). Dieses Mal werde ich über mass_write von Pymongo schreiben.


Was ist Bulk_Write?

Siehe auch: pymongo 3.9.0-Dokument: Massenschreibvorgänge


Welche Art von Operation ist möglich?

Sie können dieselben Operationen wie gewohnt mit den folgenden Operationen verwenden.

  1. InsertOne * Mit insert_many sind mehrere Einfügungen möglich
  2. ReplaceOne,
  3. UpdateOne, UpdateMany,
  4. DeleteOne, DeleteMany

Funktionsweise

Grundsätzlich müssen Sie für jede Operation nur ein Objekt erstellen, es in eine Liste einfügen und an die Funktion mass_write übergeben.

Schreibe normal

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"]

#Löschen Sie alle Dokumente in db
# db.delete_many({}) 

# _Fügen Sie 1000 Dokumente ein, indem Sie id und x erhöhen
opList = [ InsertOne({"_id":i,"x":i}) for i in range(0,1000)]

#Wenn das Schreiben erfolgreich ist, wird aus dem Rückgabewert
#Details können aus dem ausgelösten Fehler abgerufen werden, wenn eine Ausnahme auftritt
try:    
    result = db.bulk_write(opList)
    print("Am Ende des Normalen")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Wenn eine Ausnahme auftritt")
    pprint(bwe.details)
'''
{'writeErrors': [],
 'writeConcernErrors': [],
 'nInserted': 1000,
 'nUpserted': 0,
 'nMatched': 0,
 'nModified': 0,
 'nRemoved': 0,
 'upserted': []}
'''


Beim Schreiben ohne sich um die Bestellung zu sorgen

** Geben Sie in der Option batch_write einfach order = False an ** (Selbst wenn Sie etwas Illegales tun, werden alle Vorgänge versucht und Sie können die Details anhand des Rückgabewerts oder der Ausnahme sehen.)

main.py


# _Fügen Sie 1000 Dokumente ein, indem Sie id und x erhöhen
opList = [ InsertOne({"_id":i,"x":i}) for i in range(500,1500)]

#Aus dem Rückgabewert bei erfolgreichem Schreiben, aus dem ausgelösten Fehler, wenn eine Ausnahme auftritt
#Details können erhalten werden
try:    
    result = db.bulk_write(opList)
    print("Am Ende des Normalen")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Wenn eine Ausnahme auftritt")
    pprint(bwe.details)

#Ausgabeergebnis
# (Sie können sehen, dass das Einfügen des ersten Dokuments fehlgeschlagen ist und das anschließende Schreiben nicht möglich war)
'''
Wenn eine Ausnahme auftritt
{'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


# _Fügen Sie 1000 Dokumente ein, indem Sie id und x erhöhen
opList = [ InsertOne({"_id":i,"x":i}) for i in range(500,1500)]

#Aus dem Rückgabewert bei erfolgreichem Schreiben, aus dem ausgelösten Fehler, wenn eine Ausnahme auftritt
#Details können erhalten werden
try:    
    result = db.bulk_write(opList,ordered=False)
    print("Am Ende des Normalen")
    pprint(result.bulk_api_result)
except BulkWriteError as bwe:
    print("Wenn eine Ausnahme auftritt")
    pprint(bwe.details)

#Es wird eine Ausnahme ausgelöst, es können jedoch 500 Dokumente eingefügt werden.
#Sie können bestätigen, dass Sie den Grund für jeden fehlgeschlagenen Schreibvorgang erhalten können
'''
Wenn eine Ausnahme auftritt
{'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 '
                            '}',


          ~~~~Folgendes wird weggelassen~~~~

'''


Das Bulk_write von Pymongo sieht so aus. Wenn es eine Anfrage gibt, werde ich verschiedene Dinge hinzufügen.

Recommended Posts

Arbeitsmemorandum (Pymongo) Teil 2. Bequemer Betrieb (Bulk_write)
Arbeitsmemorandum (Pymongo) Teil 1. Grundlegende Bedienung
Python Basic Memorandum Teil 2