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

Perbarui Dokumen di MongoDB

1. Ikhtisar

MongoDB adalah database NoSQL sumber terbuka lintas platform, berorientasi dokumen, yang ditulis dalam C++. Selain itu, MongoDB memberikan kinerja tinggi, ketersediaan tinggi, dan penskalaan otomatis.

Untuk memperbarui dokumen di MongoDB, kita dapat menggunakan metode yang berbeda seperti updateOne , findOneAndUpdate, dll. Selanjutnya, MongoDB menyediakan berbagai operator untuk metode pembaruan.

Dalam tutorial ini, kita akan membahas berbagai pendekatan untuk melakukan operasi pembaruan di MongoDB. Untuk setiap pendekatan, pertama-tama kita akan membahas kueri mongo shell dan kemudian implementasinya di Java.

2. Penyiapan Basis Data

Sebelum kita beralih ke query update, pertama-tama kita buat databasenya, baeldung , dan koleksi sampel, siswa:

use baeldung;
db.createCollection(student);

Sebagai ilustrasi, mari kita tambahkan beberapa dokumen ke dalam koleksi siswa menggunakan insertMany permintaan:

db.student.insertMany([
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 1",
        "age": 16,
        "roll_no":199406
    },
    {
        "student_id": 8765,
        "student_name": "Andrew Boult",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199408
    }
]);

Pada penyisipan yang berhasil, kita akan mendapatkan JSON dengan acknowledged:true :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("621b078485e943405d04b557"),
	ObjectId("621b078485e943405d04b558")
    ]
}

Sekarang mari selami lebih dalam berbagai cara untuk memperbarui dokumen di MongoDB.

3. Menggunakan updateOne Metode

Operasi pembaruan di MongoDB dapat dilakukan dengan menambahkan bidang baru, menghapus bidang, atau memperbarui bidang yang ada. The updateOne  metode memperbarui satu dokumen dalam koleksi berdasarkan filter kueri yang diterapkan. Ini pertama-tama menemukan dokumen yang cocok dengan filter dan kemudian memperbarui bidang yang ditentukan.

Selain itu, kita dapat menggunakan operator yang berbeda seperti $set , $tidak disetel , $inc , dll., dengan metode pembaruan.

Untuk mendemonstrasikannya, mari kita lihat kueri untuk memperbarui satu dokumen koleksi:

db.student.updateOne(
    { 
        "student_name" : "Paul Starc"
    },
    { 
        $set: {
            "address" : "Hostel 2"
        }
    }
 );

Kami akan mendapatkan output yang mirip dengan yang ditunjukkan di bawah ini:

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

Sekarang mari kita periksa kode driver Java dari updateOne di atas permintaan:

UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));

Di sini, pertama-tama kita menggunakan nama_siswa lapangan untuk menyaring dokumen. Kemudian kami memperbarui alamat dokumen dengan nama_siswa “Paul Starc”.

4. Menggunakan updateMany Metode

updateMany metode memperbarui semua dokumen dalam koleksi MongoDB yang cocok dengan filter yang diberikan. Salah satu manfaat menggunakan updateMany adalah bahwa kami dapat memperbarui banyak dokumen tanpa kehilangan bidang dokumen lama.

Mari kita lihat kueri shell MongoDB menggunakan updateMany metode:

db.student.updateMany(
    { 
        age: { 
            $lt: 20
         } 
    },
    { 
        $set:{ 
            "Review" : true 
        }
    }
);

Perintah di atas akan mengembalikan output berikut:

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

Di sini, matchedCount berisi jumlah dokumen yang cocok, sedangkan modifiedCount berisi nomor dokumen yang dimodifikasi.

Sekarang mari kita lihat kode driver Java menggunakan updateMany metode:

UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

Di sini, semua dokumen dengan usia kurang dari 20 akan difilter, dan Ulasan bidang akan disetel ke benar .

5. Menggunakan replaceOne Metode

replaceOne metode MongoDB menggantikan seluruh dokumen. Salah satu kelemahan replaceOne adalah bahwa semua bidang lama akan diganti dengan bidang baru, dan bidang lama juga akan hilang:

db.student.replaceOne(
    { 
        "student_id": 8764
    },
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406
    }
);

Dalam hal ini, kita akan mendapatkan output berikut:

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

Jika tidak ada kecocokan yang ditemukan, operasi akan mengembalikan matchedCount sebagai 0:

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

Mari kita tulis kode driver Java yang sesuai menggunakan replaceOne metode:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age",18)
  .append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

Dalam kode di atas, kami telah membuat dokumen yang akan menggantikan dokumen lama. Dokumen dengan student_id 8764 akan diganti dengan dokumen yang baru dibuat.

6. Menggunakan findOneAndReplace Metode

findOneAndReplace metode adalah salah satu metode pembaruan lanjutan yang disediakan oleh MongoDB, dan menggantikan dokumen pertama yang cocok berdasarkan kriteria pemilihan yang diberikan. Secara default, metode ini mengembalikan dokumen asli. Kita dapat menggunakan opsi yang berbeda dari findOneAndReplace untuk menyortir dan memproyeksikan dokumen jika diperlukan.

Singkatnya, findOneAndReplace menggantikan dokumen koleksi pertama yang cocok berdasarkan filter yang diterapkan:

db.student.findOneAndReplace(
    { 
        "student_id" : { 
            $eq : 8764 
        }
    },
    { 
        "student_id" : 8764,
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    {
        returnNewDocument: false
    }
);

Kueri ini akan mengembalikan dokumen berikut:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 1",
    "age":16,
    "roll_no":199406
}

Jika kami menyetel returnNewDocument untuk benar , operasi kemudian akan mengembalikan dokumen yang diganti sebagai gantinya:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 2",
    "age":18,
    "roll_no":199406
}

Sekarang mari kita gunakan findOneAndReplace metode untuk memproyeksikan student_id dan usia bidang dalam dokumen yang dikembalikan:

db.student.findOneAndReplace(
    { 
        "student_id" : {
        $eq : 8764 
        } 
    },
    { 
        "student_id" : 8764, 
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    { 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "age" : 1 
        } 
    }
);

Output dari kueri di atas hanya akan berisi bidang yang diproyeksikan:

{
    "student_id":"8764",
    "age":16
}

Kode driver Java dari kueri di atas dengan berbagai opsi findOneAndReplace:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age", 18)
  .append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
  Filters.eq("student_id", 8764), 
  replaceDocument,
  new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));

Dalam kueri di atas, findOneAndReplace metode pertama akan mengurutkan dokumen dalam urutan menaik berdasarkan roll_no, dan dokumen yang baru dibuat menggantikan dokumen dengan student_id “8764”.

7. Menggunakan findOneAndUpdate Metode

findOneAndUpdate metode memperbarui dokumen pertama yang cocok dalam koleksi. Jika lebih dari satu dokumen cocok dengan kriteria pemilihan, maka hanya memperbarui dokumen pertama yang cocok. Saat kami memperbarui dokumen, nilai _id bidang tetap tidak berubah:

db.student.findOneAndUpdate(
    { 
        "student_id" : 8764
    },
    { 
        $inc : { 
            "roll_no" : 5
        } 
    },
    { 
        sort: { 
            "roll_no" : 1 
        }, 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "address" : 1
        }
    }
);

Keluaran kueri hanya akan berisi studentId dan alamat dari dokumen lama:

{
    "student_id":8764,
    "address":"Hostel 1"
}

Kode driver Java dari kueri di atas, menggunakan opsi yang berbeda dari findOneAndUpdate adalah sebagai berikut:

Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
  Filters.eq("student_id", 8764),
  Updates.inc("roll_no", 5), 
  new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

Dalam hal ini, findOneAndUpdate metode pertama akan mengurutkan dokumen dalam urutan menaik berdasarkan roll_no . Kueri di atas menambah roll_no  dengan 5 dan kemudian mengembalikan student_id dan alamat bidang.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Deserializing Id objek DB Mongo menggunakan serializer JSON

  2. MongoDB Opensource vs MongoDB Enterprise

  3. MongoDB $substrBytes

  4. perintah mongo tidak dikenali saat mencoba terhubung ke server mongodb

  5. Bagaimana cara menarik satu instance item dalam array di MongoDB?