1. Ikhtisar
$push adalah operator pembaruan di MongoDB yang menambahkan nilai dalam array. Sebaliknya, $set operator digunakan untuk memperbarui nilai bidang yang ada dalam dokumen.
Dalam tutorial singkat ini, kami akan memperkenalkan cara melakukan $push dan $set operasi bersama dalam satu kueri pembaruan.
2. Inisialisasi Basis Data
Sebelum kita melanjutkan untuk melakukan beberapa operasi pembaruan, pertama-tama kita perlu menyiapkan database baeldung dan koleksi sampel tanda :
use baeldung;
db.createCollection(marks);
Mari kita masukkan beberapa dokumen ke dalam koleksi tanda menggunakan insertMany metode MongoDB:
db.marks.insertMany([
{
"studentId": 1023,
"studentName":"James Broad",
"joiningYear":"2018",
"totalMarks":100,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":40
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
},
{
"studentId": 1024,
"studentName":"Chris Overton",
"joiningYear":"2018",
"totalMarks":110,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":50
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
}
]);
Pada penyisipan yang berhasil, kueri di atas akan mengembalikan respons berikut:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Sejauh ini, kami telah berhasil memasukkan beberapa contoh dokumen ke dalam koleksi tanda .
3. Memahami Masalah
Untuk memahami masalahnya, mari kita pahami dulu dokumen yang baru saja kita masukkan. Ini mencakup rincian siswa dan nilai yang diperoleh mereka dalam mata pelajaran yang berbeda. TotalMarks adalah jumlah nilai yang diperoleh dalam mata pelajaran yang berbeda.
Mari kita pertimbangkan situasi di mana kita ingin menambahkan subjek baru di subjectDetails Himpunan. Untuk juga membuat data konsisten, kami perlu memperbarui totalMarks lapangan juga.
Di MongoDB, pertama-tama, kita akan menambahkan subjek baru ke dalam array menggunakan $push operator. Kemudian kita akan mengatur totalMarks bidang ke nilai tertentu menggunakan $set operator.
Kedua operasi ini dapat dilakukan secara individual menggunakan $push dan $set operatornya masing-masing. Tetapi kita dapat menulis kueri MongoDB untuk melakukan kedua operasi tersebut bersama-sama.
4. Menggunakan Kueri Shell MongoDB
Di MongoDB, kami dapat memperbarui beberapa bidang dokumen menggunakan operator pembaruan yang berbeda. Di sini, kita akan menggunakan keduanya $push dan $set operator bersama-sama dalam updateOne kueri.
Mari kita lihat contoh yang berisi keduanya $push dan $set operator bersama:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Di sini, dalam kueri di atas, kami telah menambahkan kueri filter berdasarkan studentId. Setelah kami mendapatkan dokumen yang difilter, kami kemudian memperbarui totalMarks menggunakan operator $set. Selain itu, kami memasukkan data subjek baru ke dalam subjectDetails larik menggunakan $push operator.
Akibatnya, kueri di atas akan mengembalikan output berikut:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Di sini, matchedCount berisi jumlah dokumen yang cocok dengan filter, sedangkan modifiedCount berisi jumlah dokumen yang dimodifikasi.
5. Kode Driver Java
Sejauh ini, kita telah membahas kueri mongo shell untuk menggunakan $push dan $set operator bersama. Di sini, kita akan belajar mengimplementasikan hal yang sama menggunakan kode driver Java.
Sebelum kita melangkah maju, mari kita sambungkan dulu ke DB dan koleksi yang dibutuhkan:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Di sini, kita terhubung ke MongoDB, yang berjalan pada port default port 27017 di localhost.
Sekarang mari kita lihat kode driver Java:
Document subjectData = new Document()
.append("subjectId", 126)
.append("subjectName", "Java Programming")
.append("marks", 70);
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023),
Updates.combine(Updates.set("totalMarks", 170),
Updates.push("subjectDetails", subjectData)));
Dalam cuplikan kode ini, kami telah menggunakan updateOne metode, yang hanya memperbarui satu dokumen berdasarkan filter yang diterapkan studentId 1023. Kami kemudian menggunakan Updates.combine untuk melakukan beberapa operasi dalam satu panggilan. Bidang totalMarks akan diperbarui ke 170, dan dokumen baru subjectData akan didorong ke bidang array “subjectDetails” .