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

Panduan untuk Memasang di MongoDB

1. Ikhtisar

Upsert adalah kombinasi dari insert dan update (inSERT + UPdate =upsert). Kita bisa menggunakan upsert dengan metode pembaruan yang berbeda, yaitu perbarui , temukanDanModifikasi , dan replaceOne .

Di sini, di MongoDB, upsert pilihannya adalah Boolean nilai. Misalkan nilainya benar dan dokumen cocok dengan filter kueri yang ditentukan. Dalam hal ini, operasi pembaruan yang diterapkan akan memperbarui dokumen. Jika nilainya benar dan tidak ada dokumen yang sesuai dengan kondisi, opsi ini menyisipkan dokumen baru ke dalam koleksi. Dokumen baru akan berisi bidang berdasarkan filter dan operasi yang diterapkan.

Dalam tutorial ini, pertama-tama kita akan melihat upsert dalam kueri MongoDB Shell dan kemudian gunakan kode driver Java.

2. Inisialisasi Basis Data

Sebelum kita maju untuk melakukan upsert operasi, pertama kita perlu menyiapkan database baru baeldung dan koleksi sampel, kendaraan :

db.vehicle.insertMany([
{
    "companyName":"Nissan", 
    "modelName":"GTR",
    "launchYear":2016,
    "type":"Sports",
    "registeredNo":"EPS 5561"
},
{ 
    "companyName":"BMW",
    "modelName":"X5",
    "launchYear":2020,
    "type":"SUV",
    "registeredNo":"LLS 6899"
},
{
    "companyName":"Honda",
    "modelName":"Gold Wing",
    "launchYear":2018,
    "type":"Bike",
    "registeredNo":"LKS 2477"
}]);

Jika penyisipan berhasil, perintah di atas akan mencetak JSON yang mirip dengan yang ditunjukkan di bawah ini:

{
    "acknowledged" : true, 
    "insertedIds" : [
        ObjectId("623c1db39d55d4e137e4781b"),
	ObjectId("623c1db39d55d4e137e4781c"),
	ObjectId("623c1db39d55d4e137e4781d")
    ]
}

Kami telah berhasil menambahkan data dummy ke dalam koleksi kendaraan .

3. Menggunakan pembaruan Metode

Di bagian ini, kita akan belajar menggunakan upsert opsi dengan perbarui metode. Tujuan utama upsert opsinya adalah memperbarui dokumen yang ada berdasarkan filter yang diterapkan atau menyisipkan dokumen baru jika filter tidak cocok .

Sebagai ilustrasi, kita akan menggunakan $setOnInsert operator dengan upsert opsi untuk mendapatkan keuntungan tambahan dalam menyisipkan bidang baru ke dalam dokumen.

Mari kita periksa kueri yang kondisi filternya cocok dengan dokumen koleksi yang ada:

db.vehicle.update(
{
    "modelName":"X5"
},
{
    "$set":{
        "companyName":"Hero Honda"
    }
},
{
    "upsert":true
});

Kueri di atas akan mengembalikan dokumen berikut:

{ 
    "nMatched" : 1, 
    "nUpserted" : 0,
    "nModified" : 1 
}

Di sini, kita akan melihat kode driver Java yang sesuai dengan kueri mongo shell di atas:

UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult updateResult = collection.updateOne(Filters.eq("modelName", "X5"), 
  Updates.combine(Updates.set("companyName", "Hero Honda")), options);
System.out.println("updateResult:- " + updateResult);

Dalam kueri di atas, bidang modelName “X5” sudah ada di koleksi, jadi kolom namaperusahaan dokumen itu akan diperbarui menjadi “Hero Honda”.

Sekarang mari kita lihat contoh upsert opsi menggunakan $setOnInsert operator. Ini akan berlaku hanya dalam kasus penambahan dokumen baru:

db.vehicle.update(
{
    "modelName":"GTPR"
},
{
    "$set":{
        "companyName":"Hero Honda"
    },
    "$setOnInsert":{
        "launchYear" : 2022,
	"type" : "Bike",
	"registeredNo" : "EPS 5562"
    },  
},
{
    "upsert":true
});

Kueri di atas akan mengembalikan dokumen berikut:

{
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("623b378ed648af670fe50e7f")
}

Kode driver Java dari kueri pembaruan di atas dengan $setOnInsert pilihannya adalah:

UpdateResult updateSetOnInsertResult = collection.updateOne(Filters.eq("modelName", "GTPR"),
  Updates.combine(Updates.set("companyName", "Hero Honda"),
  Updates.setOnInsert("launchYear", 2022),
  Updates.setOnInsert("type", "Bike"),
  Updates.setOnInsert("registeredNo", "EPS 5562")), options);
System.out.println("updateSetOnInsertResult:- " + updateSetOnInsertResult);

Di sini, dalam kueri di atas, kondisi filter bidang modelName “GTPR” tidak cocok dengan dokumen koleksi mana pun, jadi kami akan menambahkan dokumen baru ke koleksi. Hal utama yang perlu diperhatikan adalah bahwa $setOnInsert menambahkan semua bidang ke dalam dokumen baru.

4. Menggunakan findAndModify Metode

Kita juga bisa menggunakan upsert opsi menggunakan findAndModify metode. Untuk metode ini, nilai default upsert pilihannya salah . Jika kita mengatur upsert pilihan untuk benar , itu akan bekerja sama persis dengan metode pembaruan.

Mari kita lihat kasus penggunaan findAndModify metode dengan upsert opsi benar :

db.vehicle.findAndModify(
{
    query:{
        "modelName":"X7"
    },
    update: {
        "$set":{
            "companyName":"Hero Honda"
        }
    },
    "upsert":true,
    "new":true
});

Dalam hal ini, kueri di atas akan mengembalikan dokumen yang baru dibuat. Mari kita periksa kode driver Java dari kueri di atas:

FindOneAndUpdateOptions upsertOptions = new FindOneAndUpdateOptions();
  upsertOptions.returnDocument(ReturnDocument.AFTER);
  upsertOptions.upsert(true);
Document resultDocument = collection.findOneAndUpdate(Filters.eq("modelName", "X7"),
  Updates.set("companyName", "Hero Honda"), upsertOptions);
System.out.println("resultDocument:- " + resultDocument);

Di sini, pertama-tama kita membuat kondisi filter dan berdasarkan itu, kita akan memperbarui dokumen yang ada atau menambahkan dokumen baru ke koleksi kendaraan .

5. Menggunakan replaceOne Metode

Ayo lakukan upsert operasi menggunakan replaceOne metode. replaceOne metode MongoDB hanya mengganti satu dokumen dalam koleksi jika kondisinya cocok.

Pertama, mari kita lihat kueri Mongo shell dari metode replace:

db.vehicle.replaceOne(
{
    "modelName":"GTPR"
},
{
    "modelName" : "GTPR",
    "companyName" : "Hero Honda",
    "launchYear" : 2022,
    "type" : "Bike",
    "registeredNo" : "EPS 5562"
},
{
    "upsert":true
});

Kueri di atas akan mengembalikan respons berikut:

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

Sekarang, mari kita tulis query di atas menggunakan kode driver Java:

Document replaceDocument = new Document();
replaceDocument.append("modelName", "GTPP")
  .append("companyName", "Hero Honda")
  .append("launchYear", 2022)
  .append("type", "Bike")
  .append("registeredNo", "EPS 5562");
UpdateResult updateReplaceResult = collection.replaceOne(Filters.eq("modelName", "GTPP"), replaceDocument, options);
System.out.println("updateReplaceResult:- " + updateReplaceResult);

Di sini, dalam hal ini, pertama-tama kita perlu membuat dokumen baru yang ingin kita ganti dengan dokumen yang ada, dan dengan upsert opsi benar , kami akan mengganti dokumen hanya jika kondisinya cocok.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa mengganti nama bidang untuk semua dokumen di MongoDB?

  2. Tidak dapat terhubung ke MongoDB (MongoLabs) melalui klien C#

  3. Cara memperbarui dan memasukkan banyak dokumen di MongoDB menggunakan C# Drivers

  4. Kueri MongoDB dengan kondisi 'atau'

  5. Bagaimana cara melewatkan ObjectId dari MongoDB di MVC.net