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

Perbarui Beberapa Bidang dalam Dokumen MongoDB

1. Ikhtisar

MongoDB adalah database NoSQL berorientasi dokumen yang tersedia untuk umum. Kami dapat memperbarui dokumen dalam koleksi menggunakan berbagai metode seperti perbarui , ganti dan simpan . Untuk mengubah bidang dokumen tertentu, kami akan menggunakan operator yang berbeda seperti $set , $inc, dll.

Dalam tutorial ini, kita akan belajar memodifikasi beberapa bidang dokumen menggunakan update dan ganti pertanyaan. Untuk tujuan demonstrasi, pertama-tama kita akan membahas kueri mongo shell dan kemudian implementasinya yang sesuai di Java.

Sekarang mari kita lihat berbagai metode untuk mencapai tujuan.

2. Kueri Shell untuk Memperbarui Bidang Berbeda

Sebelum kita mulai, mari kita buat dulu database baru, baeldung , dan koleksi sampel, karyawan . Kami akan menggunakan koleksi ini dalam semua contoh:

use baeldung;
db.createCollection(employee);

Sekarang mari tambahkan beberapa dokumen ke dalam koleksi ini menggunakan insertMany permintaan:

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 seperti yang ditunjukkan di bawah ini:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Sejauh ini, kami telah menyiapkan lingkungan yang diperlukan. Sekarang mari kita perbarui dokumen yang baru saja kita sisipkan.

2.1. Perbarui Beberapa Bidang dari Satu Dokumen

Kita bisa menggunakan $set dan $inc operator untuk memperbarui bidang apa pun di MongoDB. $set operator akan menetapkan nilai yang baru ditentukan sementara $inc operator akan meningkatkan nilai dengan nilai yang ditentukan.

Pertama-tama mari kita lihat kueri MongoDB untuk memperbarui dua bidang koleksi karyawan menggunakan $set operator:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

Dalam kueri di atas, employee_id dan nama_karyawan field digunakan untuk memfilter dokumen dan $set operator digunakan untuk memperbarui pekerjaan dan department_id bidang.

Kita juga dapat menggunakan $set dan $inc operator bersama dalam satu kueri pembaruan:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Ini akan memperbarui pekerjaan ke Manajer Penjualan dan tingkatkan department_id oleh 1.

2.2. Perbarui Beberapa Bidang dari Beberapa Dokumen

Selain itu, kami juga dapat memperbarui beberapa bidang lebih dari satu dokumen di MongoDB. Kita hanya perlu menyertakan 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 
    }
);

Atau, kita akan mendapatkan hasil yang sama menggunakan updateMany permintaan:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

Dalam kueri di atas, kami menggunakan updateMany metode untuk memperbarui lebih dari 1 dokumen koleksi.

2.3. Masalah Umum Saat Memperbarui Beberapa Bidang

Sejauh ini, kita telah belajar untuk memperbarui beberapa bidang menggunakan kueri pembaruan dengan menyediakan dua operator yang berbeda atau menggunakan satu operator di beberapa bidang.

Sekarang, jika kita menggunakan operator beberapa kali dengan bidang yang berbeda dalam satu kueri, MongoDB hanya akan memperbarui pernyataan terakhir dari kueri pembaruan dan abaikan 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 pekerjaan akan diperbarui menjadi "Manajer Penjualan". department_id nilai tidak akan diperbarui ke 3.

3. Perbarui Bidang dengan Driver Java

Sejauh ini, kita telah membahas kueri MongoDB mentah. Sekarang mari kita lakukan operasi yang sama menggunakan Java. Driver MongoDB Java mendukung dua kelas untuk mewakili dokumen MongoDB, com.mongodb.BasicDBObject dan org.bson.Document. Kami akan melihat kedua metode untuk memperbarui bidang dalam dokumen.

Sebelum melanjutkan, mari kita sambungkan dulu ke karyawan koleksi 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 kita mengasumsikan bahwa MongoDB berjalan secara lokal pada port default 27017.

3.1. Menggunakan DBObject

Untuk membuat dokumen di MongoDB, kita akan menggunakan com.mongodb. Antarmuka DBObject dan kelas implementasinya com.mongodb.BasicDBObject .

Implementasi DBObject didasarkan pada pasangan nilai kunci. BasicDBObject diwarisi dari LinkedHashMap kelas yang ada di util paket.

Sekarang mari kita gunakan com.mongodb.BasicDBObject untuk melakukan operasi pembaruan pada beberapa bidang:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

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 bson Dokumen

Kita dapat melakukan semua operasi MongoDB menggunakan bson dokumen. Untuk itu, pertama-tama kita membutuhkan objek koleksi dan kemudian melakukan operasi pembaruan menggunakan updateMany metode dengan filter dan setel fungsi.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Di sini, kami meneruskan filter kueri ke updateMany metode. persamaan filter cocok dengan employee_id dengan teks yang sama persis '794875'. Kemudian, kami memperbarui department_id dan pekerjaan menggunakan set operator.

4. Menggunakan Kueri Ganti

Pendekatan naif untuk memperbarui beberapa bidang dokumen adalah dengan 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.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

Perintah di atas akan mencetak JSON pengakuan di output:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Di sini, employee_id field digunakan untuk menyaring dokumen. Argumen kedua dari kueri pembaruan menunjukkan dokumen dari mana dokumen yang ada akan diganti.

Dalam kueri di atas, kami melakukan replaceOne , karenanya, itu hanya akan menggantikan satu dokumen dengan filter itu. Atau, jika kita ingin mengganti semua dokumen dengan kueri filter itu, maka kita perlu menggunakan updateMany metode.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB pilih di mana dalam array _id?

  2. Memulai dengan MongoDB dan Mongoose

  3. Gagal terhubung ke 127.0.0.1:27017, alasan:errno:111 Koneksi ditolak

  4. Bagaimana Melakukan Operasi Query Dasar di MongoDB

  5. ABC NestJS:Panduan Pemula dengan MongoDB(Mongoose).