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

Penjelasan MongoDB Upsert

Banyak operasi pembaruan di MongoDB berpotensi menjadi upser. Upsert adalah kombinasi dari insert dan update.

Cara kerjanya seperti ini:Anda melakukan operasi pembaruan berdasarkan kriteria filter, dan jika ada yang cocok, hanya dokumen yang cocok yang diperbarui, tetapi jika tidak ada yang cocok, maka dokumen baru akan dimasukkan.

Contoh

Misalkan kita memiliki koleksi yang disebut pets yang berisi dokumen-dokumen berikut:

 { "_id" : 1, "name" : "Wag", "type" : "Dog" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" } 

Kita dapat melakukan operasi pembaruan berikut yang menyetel upsert parameter ke true :

db.pets.updateOne( 
    { name: "Wag" },
    { $set: { type: "Cow" } },
    { upsert: true }
    )

Hasil:

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

Dalam hal ini, ada dokumen yang cocok (yaitu ada dokumen dengan name: "Wag" ) dan oleh karena itu dokumen yang cocok telah diperbarui. Tidak ada yang dimasukkan.

Kami dapat memverifikasi ini sebagai berikut:

db.pets.find()

Hasil:

 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" } 

Dokumen pertama sekarang memiliki type dari Cow .

Mari kita jalankan operasi pembaruan lain, sekali lagi menggunakan upsert: true . Namun kali ini, tidak akan ada dokumen yang cocok untuk diperbarui.

db.pets.updateOne( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Hasil:

 {
 "acknowledged" : true,
 "matchedCount" : 0,
 "modifiedCount" : 0,
 "upsertedId" : ObjectId("5fe1b4c8d9914101694100b7")
 } 

Dalam contoh ini, kami mencoba mencari dokumen yang memiliki name: "Bubbles" tapi tidak ada yang bisa ditemukan.

Kali ini kita dapat melihat bahwa matchedCount adalah 0 , dan modifiedCount juga 0 . Ini berarti tidak ada dokumen yang ada yang diperbarui.

Kita juga dapat melihat bahwa upsertedId dikembalikan, yang berarti bahwa dokumen telah dimasukkan.

Mari kita lihat lagi koleksi dokumennya:

db.pets.find()

Hasil:

 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" } 

Kita dapat melihat bahwa dokumen baru telah dimasukkan/dimasukkan dan memiliki ID yang sama seperti yang ditunjukkan di atas.

Upsert terjadi karena kali ini tidak ada dokumen yang cocok untuk diperbarui (jadi yang baru dimasukkan/dipasang sebagai gantinya).

Jika kita belum menyetel upsert: true , dokumen itu tidak akan dimasukkan.

Upsert pada Pembaruan Massal

Saat melakukan pembaruan massal, jika Anda ingin menentukan upsert: true , Anda perlu menggunakannya dengan Bulk.find.upsert() .

Ini dapat digunakan dengan operasi tulis berikut:

  • Bulk.find.replaceOne()
  • Bulk.find.updateOne()
  • Bulk.find.update()

Sintaksnya seperti ini:

Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);

Contoh:

var bulk = db.pets.initializeUnorderedBulkOp();
bulk.find( { name: "Bruce" } ).upsert().replaceOne(
   {
     name: "Bruce",
     type: "Bat",
   }
);
bulk.execute();

Hasil:

 BulkWriteResult({
 "writeErrors" : [ ],
 "writeConcernErrors" : [ ],
 "nInserted" : 0,
 "nUpserted" : 1,
 "nMatched" : 0,
 "nModified" : 0,
 "nRemoved" : 0,
 "upserted" : [
 {
 "index" : 0,
 "_id" : ObjectId("5fe1c179d9914101694100dd")
 }
 ]
 }) 

Kita dapat melihat bahwa satu dokumen telah di-upser. Kita juga bisa melihat _id yang dibuat untuk dokumen itu.

Sekarang ketika kita melihat dokumen dalam koleksi kita, kita dapat melihat dokumen baru yang telah di-upser:

db.pets.find()

Hasil:

 
 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" }
 { "_id" : ObjectId("5fe1c179d9914101694100dd"), "name" : "Bruce", "type" : "Bat" } 


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hubungkan ke Host mongodb dari wadah buruh pelabuhan

  2. Keamanan MongoDB - Sumber Daya untuk Menjaga Keamanan NoSQL DB

  3. Bagaimana mengembalikan data JSON dari php MongoCursor

  4. MongoDB $dateFromParts

  5. Buat, Baca, Perbarui, Hapus data dengan menggunakan Node.js - Mongoose