MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Upsert Cepat atau Massal di pymongo

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:locale::facet::_S_create_c_nama lokal tidak valid

  2. NestJS:Cara Menerapkan Otentikasi Pengguna Berbasis Sesi

  3. Luwak menimpa dokumen daripada bidang `$set`

  4. Impor Data ke MongoDB Dari File JSON Menggunakan Java

  5. beberapa contoh Mongo DB di server yang sama