Lewati ke konten utama

Cara Menggunakan updateMany() di MongoDB untuk Memodifikasi Banyak Dokumen

Pelajari cara menggunakan dan mengoptimalkan kinerja operator updateMany() di MongoDB untuk memperbarui banyak dokumen dalam satu operasi.
· 4 mnt Baca

Jelajahi bersama AI

Dalam MongoDB, ada kalanya Anda ingin memperbarui beberapa dokumen sekaligus dalam satu operasi. Anda bisa saja melakukan loop pada dokumen dan memperbaruinya satu per satu, tetapi updateMany menawarkan solusi yang lebih cepat dan efisien.

Dalam tutorial singkat ini, kita akan mempelajari cara menggunakan operator updateMany di MongoDB dan mengoptimalkan kueri untuk mencapai kinerja terbaik.

Untuk membangun dasar yang kuat dalam kemampuan penanganan data MongoDB menggunakan Python, pertimbangkan untuk menjelajahi kursus Introduction to MongoDB in Python.

Melihat Contoh Praktis Memperbarui Banyak Dokumen MongoDB

Untuk mengilustrasikan konsep ini, mari gunakan contoh praktis ketika Anda mungkin ingin memperbarui lebih dari satu dokumen sekaligus.

Gunakan data berikut sebagai landasan contoh kita:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") },
    { "name": "Tony Kim", "title": "Alliance Czar", "salary": 80000, "last_raise_date": new Date("2025-02-01") },
];

Pada JSON di atas, kita memiliki tiga karyawan di sebuah perusahaan fiksi. Perusahaan ingin memberikan kenaikan kompensasi kepada semua orang jika mereka belum menerima penyesuaian gaji selama jangka waktu tertentu.

Untuk memperbarui semua yang memenuhi syarat, kita dapat memanfaatkan operator updateMany di MongoDB. Untuk menyelesaikan tugas kita, kita mungkin akan menggunakan pernyataan seperti berikut:

db.employees.updateMany(
    {
        "last_raise_date": {
            "$lte": new Date("2024-01-01")
        }
    },
    {
        "$mul": { "salary": 1.06 },
        "$set": { "last_raise_date": new Date() }
    }
);

Jadi, apa yang dilakukan operasi updateMany di atas?

Secara garis besar, operator updateMany menerima dua parameter dengan satu parameter opsional ketiga. 

  • Parameter pertama adalah objek yang merepresentasikan data yang ingin kita saring. 
  • Parameter kedua adalah perubahan yang ingin kita lakukan pada hasil yang ditemukan oleh filter. 
  • Parameter ketiga yang opsional bisa berupa { “upsert”: true }, yang akan menyisipkan dokumen jika tidak ada kecocokan.

Dengan demikian, pertama-tama kita memfilter semua dokumen di mana last_raise_date lebih awal dari "2024-01-01". Melihat kembali dataset kita yang sangat sederhana, kita tahu ada dua dari tiga dokumen yang cocok:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") }
];

Dua perubahan berbeda akan diterapkan pada dokumen yang terfilter berdasarkan parameter kriteria perubahan.

"$mul": { "salary": 1.06 },

Pertama, kita menggunakan operator $mul untuk mengalikan salah satu field dengan sebuah nilai. Dalam contoh kita, kita ingin memberikan kenaikan gaji 6% kepada setiap karyawan yang memenuhi syarat. Artinya, kita cukup mengalikan nilai saat ini dari field tersebut dengan 1,06.

Untuk membantu kita mendokumentasikan penyesuaian gaji sekaligus mencegah kenaikan tidak disengaja di masa depan, kita ingin memperbarui last_raise_date ke tanggal saat ini:

"$set": { "last_raise_date": new Date() }

Jika kita menjalankan operasi updateMany lagi, tidak akan terjadi apa-apa karena last_raise_date yang digunakan pada filter tidak lagi cocok dengan salah satu dari tiga dokumen kita.

Contoh di atas hanyalah ilustrasi, tetapi kriteria filter Anda bisa jauh lebih kompleks, begitu pula perubahan yang Anda rencanakan pun bisa lebih rumit, bergantung pada use case Anda. Anda dapat mempelajari lebih lanjut tentang updateMany MongoDB dalam video ini. 

Tingkatkan Performa Pembaruan Anda dengan Indeks MongoDB

Dalam contoh kita, kita bekerja dengan tiga dokumen kecil. Hampir apa pun operasi yang kita jalankan pada koleksi, hasilnya akan cepat karena volumenya sangat sedikit. Namun, pikirkan aplikasi produksi di mana Anda bekerja dengan jutaan dokumen atau sering menjalankan operasi pembaruan.

Jika kita mencoba menggunakan operator updateMany pada jutaan dokumen, prosesnya bisa memakan waktu kecuali kita memiliki indeks yang tepat untuk kriteria filter kita.

Untuk membuat indeks pada contoh kita, kita bisa mengeksekusi perintah seperti ini:

db.employees.createIndex({ "last_raise_date": 1 });

Anda dapat memvalidasi bahwa operasi updateMany menggunakan indeks dengan mengeksekusi hal berikut:

db.runCommand({
    "explain": {
        "update": "employees",
        "updates": [
            {
                "q": { 
                    "last_raise_date": { 
                        "$lte": new Date("2024-01-01") 
                    }
                },
                "u": {
                    "$mul": { "salary": 1.06 },
                    "$set": { "last_raise_date": new Date() }
                }
            }
        ]
    },
    "verbosity": "allPlansExecution"
});

Pada hasilnya, jika inputStage adalah "IXSCAN," berarti Anda menggunakan indeks dan memaksimalkan performa updateMany. Jika inputStage adalah "COLLSCAN," berarti Anda tidak menggunakan indeks dan mungkin perlu meninjau kembali cara Anda membuat indeks berdasarkan kriteria filter Anda.

Untuk memperjelas, kita menggunakan runCommand di atas untuk memprofil operasi pembaruan banyak dokumen. Jika Anda tidak membutuhkan informasi profiler, tetaplah menggunakan operasi updateMany yang jauh lebih sederhana dan elegan.

Kesimpulan

Memperbarui banyak dokumen dalam satu operasi di MongoDB bukanlah tugas yang sulit, seperti yang terlihat sepanjang tutorial ini. 

Dengan menggunakan operator updateMany, kita dapat menentukan kriteria filter untuk mencocokkan dokumen dan kemudian kriteria perubahan dengan daftar perubahan yang akan diterapkan. Operasi updateMany ini dapat dioptimalkan lebih lanjut dengan memastikan Anda memiliki indeks yang sesuai dengan kriteria filter Anda.

Jika Anda baru mengenal basis data non-relasional, kursus Introduction to NoSQL menawarkan tinjauan yang bermanfaat tentang konsep seperti document store.

FAQs

Apa perbedaan antara updateOne dan updateMany di MongoDB?

 updateOne memodifikasi dokumen pertama yang cocok, sedangkan updateMany memperbarui semua dokumen yang memenuhi kriteria filter. Pilih berdasarkan cakupan perubahan yang diinginkan.

Apakah updateMany dapat digunakan dengan upsert di MongoDB?

Ya, menambahkan { upsert: true } sebagai argumen ketiga akan menyisipkan dokumen baru jika tidak ditemukan kecocokan. Namun, ini lebih umum digunakan dengan updateOne.

Apa saja use case umum untuk updateMany?

Sering digunakan untuk pembaruan batch seperti menyesuaikan harga, memodifikasi status pengguna, atau membersihkan field usang dalam dataset besar.

Apakah updateMany mengembalikan data hasil?

Ya, ini mengembalikan objek dengan informasi seperti matchedCount dan modifiedCount, yang menunjukkan berapa banyak dokumen yang cocok dan diperbarui.

Apa yang terjadi jika tidak ada dokumen yang cocok dengan filter pada updateMany?

Jika tidak ada dokumen yang cocok dan upsert tidak digunakan, operasi selesai tanpa perubahan. Tidak ada error yang dilempar.

Apakah updateMany bersifat atomik di MongoDB?

Tidak, ini tidak bersifat atomik lintas banyak dokumen. Setiap pembaruan dokumen bersifat atomik sendiri-sendiri tetapi tidak secara kolektif.

Bagaimana saya dapat menguji performa operasi updateMany?

Gunakan metode explain() atau runCommand({ explain: ... }) untuk melihat apakah kueri Anda menggunakan indeks atau melakukan pemindaian koleksi.

Bisakah saya menggabungkan beberapa operator pembaruan dalam updateMany?

Ya, MongoDB mendukung penggabungan operator seperti $set, $inc, $mul, dan lainnya dalam satu pemanggilan updateMany.

Apa dampak indeks pada operasi updateMany?

Indeks dapat meningkatkan performa secara drastis dengan mengurangi jumlah dokumen yang dipindai saat penyaringan.

Bagaimana cara membatalkan operasi updateMany yang tidak disengaja?

Anda perlu melakukan pemulihan dari backup atau log, karena MongoDB tidak memiliki rollback bawaan untuk updateMany. Selalu uji di staging dan cadangkan data produksi terlebih dahulu.

Nic Raboy

Penulis

Nic Raboy

Nic Raboy adalah Pimpinan Developer Relations di MongoDB, memimpin tim pengembang Python, Java, C#, dan PHP yang membuat konten luar biasa untuk membantu para pengembang berhasil mengintegrasikan MongoDB ke dalam proyek mereka. Ia berpengalaman dengan Golang dan JavaScript dan sering menulis tentang berbagai petualangan pengembangannya.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai