2014-12-08 16 views
5

Tôi đang cố gắng lưu trữ dữ liệu từ điển trong cơ sở dữ liệu của mình qua PyMongo.PyMongo cập nhật nhiều bản ghi với nhiều dữ liệu

client = MongoClient('ip', port) 
db = client.test_database 
hdd = db.hdd 

     products[{ 
     'Speed' : 'a', 
     'Capacity' : 'b', 
     'Format' : 'c' 
     } 
     { 
     'Speed' : 'd', 
     'Capacity' : 'e', 
     'Format': 'f'}] ... 

Cơ sở dữ liệu của tôi có bảng hdd với 7 trường và 4 trường đã được điền. Giá trị của Speed, capacityformat"" và cần được thay thế bằng dữ liệu của products. Tôi muốn điền vào các trường trống với dữ liệu của từ điển. Có cách nào để cập nhật hdd như vậy và nếu có thể, làm cách nào?

Trả lời

3

Tôi giả sử bạn có một số loại giá trị "_id" được liên kết với từng bộ giá trị, vì vậy bạn biết tài liệu nào trong bộ sưu tập của mình cần cập nhật? Hãy gọi đó là "product_id". Bạn có thể cập nhật các tài liệu cá nhân như:

for product, product_id in data: 
    hdd.update({'_id': product_id}, 
       {'$set': {'Speed': products['Speed'], 
         'capacity': products['capacity'], 
         'format': products['format']}}) 

Đối số đầu tiên để cập nhật là một truy vấn chỉ định mà tài liệu để phù hợp, thứ hai là một tập hợp các update operations.

Nếu bạn đang ở trên MongoDB 2.6 hoặc mới hơn và PyMongo mới nhất, sử dụng một cập nhật hàng loạt:

bulk = hdd.initialize_ordered_bulk_op() 
for product, product_id in data: 
    bulk.find({'_id': product_id}).update({'$set': {'Speed': products['Speed'], 
                'capacity': products['capacity'], 
                'format': products['format']}}) 
bulk.execute() 

Các hoạt động được đệm trên máy khách, thì rõ ràng chúng gửi đến máy chủ và thực hiện tại một lần khi bạn gọi "execute()". Bulk update operations với PyMongo và MongoDB 2.6+ yêu cầu ít chuyến đi khứ hồi tới máy chủ hơn là các cập nhật truyền thống.

+0

bạn không thể chỉ cần chuyển toàn bộ tập hợp sang phương thức update_many thay vì lặp qua chúng? Giả sử bạn muốn cập nhật tất cả các bản ghi? cursor = db.collection.update_many({}, myposts, upsert=True)> – Noah

+0

điều này không hiệu quả đối với tôi. myposts là một mảng tài liệu. – Noah

Các vấn đề liên quan