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" }