MongoDB adalah database NoSQL berorientasi dokumen yang tersedia untuk umum. Kami dapat memperbarui dokumen dalam koleksi menggunakan berbagai metode seperti memperbarui, mengganti, dan menyimpan. Untuk mengubah kolom tertentu pada dokumen, kami akan menggunakan operator yang berbeda seperti $set, $inc, dll
Dalam tutorial ini, kita akan belajar memodifikasi beberapa bidang dokumen menggunakan kueri pembaruan dan penggantian. Untuk tujuan demonstrasi, pertama-tama kita akan membahas kueri shell mongo dan kemudian penerapannya yang sesuai di Java
Sekarang mari kita lihat berbagai metode untuk mencapai tujuan tersebut
2. Permintaan Shell untuk Memperbarui Bidang Berbeda
Sebelum kita mulai, mari kita buat terlebih dahulu database baru, baeldung, dan kumpulan sampel, karyawan. Kami akan menggunakan koleksi ini di semua contoh
use baeldung; db.createCollection(employee);Sekarang mari tambahkan beberapa dokumen ke dalam koleksi ini menggunakan kueri insertMany
db.employee.insertMany([ { "employee_id": 794875, "employee_name": "David Smith", "job": "Sales Representative", "department_id": 2, "salary": 20000, "hire_date": NumberLong("1643969311817") }, { "employee_id": 794876, "employee_name": "Joe Butler", "job": "Sales Manager", "department_id": 3, "salary": 30000, "hire_date": NumberLong("1645338658000") } ]);_Hasilnya, kita akan mendapatkan JSON dengan ObjectId untuk kedua dokumen tersebut seperti yang ditunjukkan di bawah ini
{ "acknowledged": true, "insertedIds": [ ObjectId("6211e034b76b996845f3193d"), ObjectId("6211e034b76b996845f3193e") ] }Sejauh ini, kami telah menyiapkan lingkungan yang diperlukan. Sekarang mari perbarui dokumen yang baru saja kita sisipkan
2. 1. Perbarui Beberapa Bidang dari Satu Dokumen
Kita dapat menggunakan operator $set dan $inc untuk memperbarui bidang apa pun di MongoDB. Operator $set akan menetapkan nilai yang baru ditentukan sedangkan operator $inc akan meningkatkan nilai dengan nilai yang ditentukan
Pertama-tama mari kita lihat kueri MongoDB untuk memperbarui dua bidang koleksi karyawan menggunakan operator $set
Dalam kueri di atas, kolom employee_id dan employee_name digunakan untuk memfilter dokumen dan operator $set digunakan untuk memperbarui kolom job dan department_id
Kita juga dapat menggunakan operator $set dan $inc secara bersamaan dalam satu kueri pembaruan
db.employee.updateOne( { "employee_id": 794875 }, { $inc: { department_id: 1 }, $set: { job: "Sales Manager" } } );_Ini akan memperbarui bidang pekerjaan ke Manajer Penjualan dan menambah department_id sebesar 1
2. 2. Perbarui Beberapa Bidang dari Banyak Dokumen
Selain itu, kami juga dapat memperbarui banyak bidang lebih dari satu dokumen di MongoDB. Kami hanya perlu memasukkan opsi multi. true untuk mengubah semua dokumen yang cocok dengan kriteria kueri filter
db.employee.update( { "job": "Sales Representative" }, { $inc: { salary: 10000 }, $set: { department_id: 5 } }, { multi: true } );Alternatifnya, kita akan mendapatkan hasil yang sama menggunakan kueri updateMany
db.employee.updateMany( { "job": "Sales Representative" }, { $inc: { salary: 10000 }, $set: { department_id: 5 } } );_Dalam kueri di atas, kami menggunakan metode updateMany untuk memperbarui lebih dari 1 dokumen koleksi
2. 3. Masalah Umum Saat Memperbarui Banyak Bidang
Sejauh ini, kami telah belajar untuk memperbarui banyak bidang menggunakan kueri pembaruan dengan menyediakan dua operator berbeda atau menggunakan satu operator di banyak bidang
Sekarang, jika kita menggunakan operator berkali-kali dengan bidang yang berbeda dalam satu kueri, MongoDB hanya akan memperbarui pernyataan terakhir dari kueri pembaruan dan mengabaikan sisanya
db.employee.updateMany( { "employee_id": 794875 }, { $set: { department_id: 3 }, $set: { job:"Sales Manager" } } );Kueri di atas akan mengembalikan output yang mirip dengan ini
{ "acknowledged":true, "matchedCount":1, "modifiedCount":1 }_Dalam hal ini, satu-satunya tugas akan diperbarui menjadi "Manajer Penjualan". Nilai department_id tidak akan diperbarui ke 3
3. Perbarui Bidang dengan Driver Java
Sejauh ini, kami telah membahas kueri MongoDB mentah. Sekarang mari kita lakukan operasi yang sama menggunakan Java. Driver Java MongoDB mendukung dua kelas untuk mewakili dokumen MongoDB, com. mongodb. BasicDBObject dan org. bson. Dokumen. Kami akan melihat kedua metode untuk memperbarui bidang dalam dokumen
Sebelum kita melanjutkan, mari kita hubungkan terlebih dahulu ke employee collection di dalam baeldung DB
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017); MongoDatabase database = mongoClient.getDatabase("baeldung"); MongoCollection<Document> collection = database.getCollection("employee");_Di sini kami berasumsi bahwa MongoDB berjalan secara lokal di port default 27017
3. 1. Menggunakan DBObject
Untuk membuat dokumen di MongoDB, kami akan menggunakan com. mongodb. Antarmuka DBObject dan kelas implementasinya com. mongodb. Objek BasicDBO
Implementasi DBObject didasarkan pada key-value pair. BasicDBObject diwariskan dari kelas LinkedHashMap yang ada di dalam paket util
Sekarang mari kita gunakan com. mongodb. BasicDBObject untuk melakukan operasi update di beberapa kolom
Di sini, pertama, kami membuat kueri filter berdasarkan employee_id. Operasi ini akan mengembalikan satu set dokumen. Selanjutnya, kami telah memperbarui nilai department_id dan pekerjaan sesuai dengan kueri yang ditetapkan
3. 2. Menggunakan Dokumen bson
Kami dapat melakukan semua operasi MongoDB menggunakan dokumen bson. Untuk itu, pertama-tama kita membutuhkan objek koleksi dan kemudian melakukan operasi pembaruan menggunakan metode updateMany dengan fungsi filter dan set
db.employee.insertMany([ { "employee_id": 794875, "employee_name": "David Smith", "job": "Sales Representative", "department_id": 2, "salary": 20000, "hire_date": NumberLong("1643969311817") }, { "employee_id": 794876, "employee_name": "Joe Butler", "job": "Sales Manager", "department_id": 3, "salary": 30000, "hire_date": NumberLong("1645338658000") } ]);_1Di sini, kami meneruskan filter kueri ke metode updateMany. Filter eq cocok dengan employee_id dengan teks yang sama persis '794875'. Kemudian, kami memperbarui id_departemen dan pekerjaan menggunakan operator yang ditetapkan
4. Menggunakan Ganti Kueri
Pendekatan naif untuk memperbarui beberapa bidang dokumen adalah menggantinya dengan dokumen baru yang memiliki nilai yang diperbarui
Misalnya, jika kita ingin mengganti dokumen dengan employee_id 794875, kita dapat menjalankan kueri berikut
db.employee.insertMany([ { "employee_id": 794875, "employee_name": "David Smith", "job": "Sales Representative", "department_id": 2, "salary": 20000, "hire_date": NumberLong("1643969311817") }, { "employee_id": 794876, "employee_name": "Joe Butler", "job": "Sales Manager", "department_id": 3, "salary": 30000, "hire_date": NumberLong("1645338658000") } ]);_2Perintah di atas akan mencetak JSON pengakuan dalam output
{ "acknowledged":true, "matchedCount":1, "modifiedCount":1 }_Di sini, kolom employee_id digunakan untuk memfilter dokumen. Argumen kedua dari kueri pembaruan menunjukkan dokumen dari mana dokumen yang ada akan diganti
Dalam kueri di atas, kami melakukan replaceOne, karenanya, ini hanya akan mengganti satu dokumen dengan filter itu. Sebagai alternatif, jika kita ingin mengganti semua dokumen dengan kueri filter tersebut, maka kita perlu menggunakan metode updateMany
5. Kesimpulan
Pada artikel ini, kami menjelajahi berbagai cara untuk memperbarui banyak bidang dokumen di MongoDB. Kami secara luas membahas dua implementasi, menggunakan shell MongoDB dan menggunakan driver Java
Ada berbagai opsi untuk memperbarui beberapa kolom dokumen termasuk $inc dan $set operator