Các bản phát hành hiện đại của pymongo (lớn hơn 3.x) bao gồm các hoạt động hàng loạt trong một giao diện nhất quán hạ cấp trong đó bản phát hành máy chủ không hỗ trợ các hoạt động hàng loạt. Điều này hiện nhất quán trong các trình điều khiển được hỗ trợ chính thức của MongoDB.
Vì vậy, phương pháp ưa thích để viết mã là sử dụng bulk_write()
thay vào đó, nơi bạn sử dụng UpdateOne
hành động hoạt động thích hợp khác thay thế. Và tất nhiên bây giờ chúng ta nên sử dụng danh sách ngôn ngữ tự nhiên hơn là một trình tạo cụ thể
Bản dịch trực tiếp của tài liệu cũ:
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)
Hoặc vòng lặp chuyển đổi tài liệu cổ điển:
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)
Kết quả trả về là của BulkWriteResult
trong đó sẽ chứa bộ đếm các tài liệu phù hợp và cập nhật cũng như _id
được trả về giá trị cho bất kỳ "cảnh báo" nào xảy ra.
Có một chút quan niệm sai lầm về kích thước của mảng hoạt động hàng loạt. Yêu cầu thực tế khi được gửi đến máy chủ không được vượt quá giới hạn 16MB BSON vì giới hạn đó cũng áp dụng cho "yêu cầu" được gửi tới máy chủ cũng đang sử dụng định dạng BSON.
Tuy nhiên, điều đó không chi phối kích thước của mảng yêu cầu mà bạn có thể tạo, vì dù sao thì các hoạt động thực tế sẽ chỉ được gửi và xử lý theo lô 1000. Hạn chế thực sự duy nhất là bản thân 1000 hướng dẫn hoạt động đó không thực sự tạo ra một tài liệu BSON lớn hơn 16MB. Đó thực sự là một đơn đặt hàng khá cao.
Khái niệm chung của phương pháp số lượng lớn là "ít lưu lượng truy cập hơn", do gửi nhiều thứ cùng một lúc và chỉ xử lý với một phản hồi của máy chủ. Việc giảm thiểu chi phí kèm theo cho mỗi yêu cầu cập nhật giúp tiết kiệm rất nhiều thời gian.