Rilis modern pymongo ( lebih besar dari 3.x ) membungkus operasi massal dalam antarmuka yang konsisten yang menurunkan versi di mana rilis server tidak mendukung operasi massal. Ini sekarang konsisten di driver yang didukung secara resmi MongoDB.
Jadi metode pengkodean yang disukai adalah menggunakan bulk_write()
sebagai gantinya, di mana Anda menggunakan UpdateOne
tindakan operasi lain yang sesuai sebagai gantinya. Dan sekarang tentu saja lebih disukai menggunakan daftar bahasa alami daripada pembangun tertentu
Terjemahan langsung dari dokumen lama:
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)
Atau loop transformasi dokumen klasik:
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)
Hasil yang dikembalikan adalah BulkWriteResult
yang akan berisi penghitung dokumen yang cocok dan diperbarui serta _id
. yang dikembalikan nilai untuk setiap "peningkatan" yang terjadi.
Ada sedikit kesalahpahaman tentang ukuran array operasi massal. Permintaan aktual yang dikirim ke server tidak boleh melebihi batas BSON 16 MB karena batas tersebut juga berlaku untuk "permintaan" yang dikirim ke server yang juga menggunakan format BSON.
Namun itu tidak mengatur ukuran larik permintaan yang dapat Anda buat, karena operasi sebenarnya hanya akan dikirim dan diproses dalam kumpulan 1000. Satu-satunya batasan nyata adalah bahwa 1000 instruksi operasi itu sendiri tidak benar-benar membuat dokumen BSON lebih besar dari 16MB. Yang memang merupakan urutan yang cukup tinggi.
Konsep umum metode massal adalah "kurang lalu lintas", sebagai akibat dari pengiriman banyak hal sekaligus dan hanya berurusan dengan satu respons server. Pengurangan overhead yang melekat pada setiap permintaan pembaruan menghemat banyak waktu.