Hướng dẫn này giải thích cách tận dụng các tính năng thao tác ghi hàng loạt của PyMongo. Thực hiện các thao tác ghi theo lô giúp giảm số lượng vòng lặp mạng, tăng thông lượng ghi
Chèn hàng loạt
Mới trong phiên bản 2. 6
Có thể chèn một loạt tài liệu bằng cách chuyển danh sách tới phương thức. PyMongo sẽ tự động chia lô thành các lô nhỏ hơn dựa trên kích thước thư tối đa được MongoDB chấp nhận, hỗ trợ các hoạt động chèn số lượng lớn rất lớn
>>> import pymongo >>> db = pymongo.MongoClient[].bulk_example >>> db.test.insert_many[[{'i': i} for i in range[10000]]].inserted_ids [...] >>> db.test.count_documents[{}] 10000
Hoạt động ghi hàng loạt hỗn hợp
Mới trong phiên bản 2. 7
PyMongo cũng hỗ trợ thực hiện các thao tác ghi hàng loạt hỗn hợp. Một loạt thao tác chèn, cập nhật và xóa có thể được thực thi cùng nhau bằng cách sử dụng API thao tác ghi hàng loạt
Hoạt động ghi số lượng lớn được đặt hàng
Các hoạt động ghi hàng loạt đã đặt hàng được thực hiện theo đợt và gửi đến máy chủ theo thứ tự được cung cấp để thực hiện nối tiếp. Giá trị trả về là một ví dụ mô tả loại và số lượng hoạt động được thực hiện
>>> from pprint import pprint >>> from pymongo import InsertOne, DeleteMany, ReplaceOne, UpdateOne >>> result = db.test.bulk_write[[ .. DeleteMany[{}], # Remove all documents from the previous example. .. InsertOne[{'_id': 1}], .. InsertOne[{'_id': 2}], .. InsertOne[{'_id': 3}], .. UpdateOne[{'_id': 1}, {'$set': {'foo': 'bar'}}], .. UpdateOne[{'_id': 4}, {'$inc': {'j': 1}}, upsert=True], .. ReplaceOne[{'j': 1}, {'j': 2}]]] >>> pprint[result.bulk_api_result] {'nInserted': 3, 'nMatched': 2, 'nModified': 2, 'nRemoved': 10000, 'nUpserted': 1, 'upserted': [{'_id': 4, 'index': 5}], 'writeConcernErrors': [], 'writeErrors': []}
Lỗi ghi đầu tiên xảy ra [e. g. lỗi khóa trùng lặp] hủy bỏ các hoạt động còn lại và PyMongo tăng. Thuộc tính ________ 4 của trường hợp ngoại lệ cung cấp kết quả thực thi cho đến khi xảy ra lỗi và thông tin chi tiết về lỗi - bao gồm cả thao tác gây ra lỗi
>>> from pymongo import InsertOne, DeleteOne, ReplaceOne >>> from pymongo.errors import BulkWriteError >>> requests = [ .. ReplaceOne[{'j': 2}, {'i': 5}], .. InsertOne[{'_id': 4}], # Violates the unique key constraint on _id. .. DeleteOne[{'i': 5}]] >>> try: .. db.test.bulk_write[requests] .. except BulkWriteError as bwe: .. pprint[bwe.details] ... {'nInserted': 0, 'nMatched': 1, 'nModified': 1, 'nRemoved': 0, 'nUpserted': 0, 'upserted': [], 'writeConcernErrors': [], 'writeErrors': [{'code': 11000, 'errmsg': '...E11000...duplicate key error...', 'index': 1,... 'op': {'_id': 4}}]}
Thao tác ghi hàng loạt không theo thứ tự
Các hoạt động ghi hàng loạt không theo thứ tự được thực hiện theo đợt và gửi đến máy chủ theo thứ tự tùy ý nơi chúng có thể được thực thi song song. Bất kỳ lỗi nào xảy ra đều được báo cáo sau khi thực hiện tất cả các thao tác
Trong ví dụ tiếp theo, thao tác thứ nhất và thứ ba không thành công do ràng buộc duy nhất trên _id. Vì chúng tôi đang thực hiện không theo thứ tự nên hoạt động thứ hai và thứ tư thành công
>>> requests = [ .. InsertOne[{'_id': 1}], .. DeleteOne[{'_id': 2}], .. InsertOne[{'_id': 3}], .. ReplaceOne[{'_id': 4}, {'i': 1}]] >>> try: .. db.test.bulk_write[requests, ordered=False] .. except BulkWriteError as bwe: .. pprint[bwe.details] ... {'nInserted': 0, 'nMatched': 1, 'nModified': 1, 'nRemoved': 1, 'nUpserted': 0, 'upserted': [], 'writeConcernErrors': [], 'writeErrors': [{'code': 11000, 'errmsg': '...E11000...duplicate key error...', 'index': 0,... 'op': {'_id': 1}}, {'code': 11000, 'errmsg': '...', 'index': 2,... 'op': {'_id': 3}}]}
Viết mối quan tâm
Các hoạt động hàng loạt được thực thi với bộ sưu tập mà chúng được thực thi đối với. Viết lỗi quan tâm [e. g. wtimeout] sẽ được báo cáo sau khi tất cả các hoạt động được thực hiện, bất kể thứ tự thực hiện