MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nâng cấp nhanh hoặc hàng loạt trong pymongo

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Các đơn vị sử dụng cho maxdistance và MongoDB?

  2. Tài liệu ClusterControl 1.5 - Có gì mới

  3. Cách quản lý người dùng và xác thực trong MongoDB

  4. Mongo DB tìm tất cả các bản ghi có giá trị cao nhất tùy thuộc vào trường khóa

  5. Sử dụng toàn cầu JsonConverter trên một lớp không có thuộc tính