Di MongoDB db.collection.findOneAndReplace()
metode menggantikan satu dokumen berdasarkan filter yang ditentukan.
collection
bagian adalah nama koleksi yang digunakan untuk melakukan operasi terhadap.
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 menggunakan db.collection.findOneAndReplace()
metode untuk mengganti salah satu dokumen tersebut.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
Hasil:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Secara default, ini mengembalikan dokumen asli (bukan versi yang dimodifikasi).
Perhatikan bahwa hanya satu anjing yang diperbarui, meskipun ada dua anjing dalam koleksi.
Yuk cek koleksinya.
db.pets.find()
Hasil:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Kita dapat melihat bahwa dokumen pertama telah diganti dengan dokumen baru.
Perhatikan bahwa dokumen pengganti tidak dapat menentukan _id
nilai yang berbeda dari _id
nilai dalam dokumen yang diganti.
Kembalikan Dokumen yang Dimodifikasi
Secara default, dokumen asli dikembalikan saat Anda menggunakan db.collection.findOneAndReplace()
.
Jika Anda lebih suka agar dokumen yang dimodifikasi dikembalikan, gunakan returnNewDocument
parameter.
Mari kita buat modifikasi lain, tapi kali ini kita akan menggunakan returnNewDocument: true
.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
Hasil:
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
Kali ini anjing lainnya diperbarui. Dalam hal ini, kami membuat perubahan yang lebih signifikan, dan kami dapat melihat bahwa dokumen pengembalian mencerminkan hal ini.
Kami dapat memeriksa kembali koleksi untuk melihat dokumen yang diganti.
db.pets.find()
Hasil:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Upser
Upsert adalah opsi yang dapat Anda gunakan pada operasi pembaruan. Jika dokumen yang ditentukan tidak ada, yang baru akan dimasukkan. Jika bisa ada, maka dokumen asli diperbarui (dan tidak ada dokumen yang dimasukkan).
Anda dapat melakukan upsert dengan menentukan upsert: true
.
Contoh menggunakan upsert: false
Pertama, berikut adalah contoh mencoba memperbarui dokumen yang tidak ada saat upsert: false
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
Hasil:
null
Dokumen tidak ada dalam koleksi sehingga findOneAndReplace()
mengembalikan null
. Meskipun kami tidak secara eksplisit menentukan upsert: false
, kami tahu itu salah karena itu adalah nilai default (yaitu nilai yang digunakan saat Anda tidak menentukan opsi upsert).
Jika kita melihat kembali koleksinya, kita dapat melihat bahwa dokumen tersebut tidak di-upser.
db.pets.find()
Hasil:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Contoh menggunakan upsert: true
Nah ini dia lagi, tapi kali ini kita tentukan upsert: true
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
Hasil:
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Kali ini dokumen baru di-upser dan kita melihat dokumen yang di-upsert sebagai output (karena kita menetapkan returnNewDocument: true
).
Yuk cek lagi koleksinya.
db.pets.find()
Hasil:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Jadi kita bisa melihat bahwa dokumen baru itu sebenarnya di-upser.
sort
Parameter
Anda dapat menggunakan sort
parameter untuk menentukan urutan penyortiran untuk dokumen yang cocok dengan filter
.
Saat menggunakan sort
parameter, nilai 1
mengurutkan dokumen ke dalam urutan menaik, dan nilai -1
mengurutkannya ke dalam urutan menurun.
Argumen perlu diberikan sebagai dokumen. Misalnya, { sort: { "salary": 1 } }
urutkan berdasarkan salary
bidang dalam urutan menaik.
Misalnya, kita membuat koleksi yang disebut employees
dengan dokumen sebagai berikut:
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Kita dapat menjalankan kode berikut untuk menemukan dokumen dengan gaji kurang dari 60000, lalu mengganti yang terendah dari dokumen tersebut.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Hasil:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Ini menunjukkan dokumen sebelum diperbarui. Seperti yang diharapkan, karyawan dengan gaji terendah diganti dengan gaji baru (dan nama baru).
Begini tampilan dokumennya sekarang.
db.employees.find()
Hasil:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fluffy", "salary" : 250000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Jadi kita bisa melihat bahwa Fritz telah digantikan oleh Fluffy yang memiliki gaji yang jauh lebih baik.
Mari kita kembalikan ke dokumen aslinya.
db.employees.remove({})
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Sekarang mari kita jalankan findOneAndReplace()
yang sama kode lagi, tapi kali ini kita akan mengurutkannya dalam urutan menurun.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Hasil:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Kali ini Sandy diganti.
Yuk cek lagi koleksinya.
db.employees.find()
Hasil:
{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Seperti yang diharapkan.
Informasi Lebih Lanjut
db.collection.findOneAndReplace()
metode juga menerima parameter lain, seperti projection
(untuk menentukan subset bidang yang akan dikembalikan), maxTimeMS
, dan collation
.
Lihat dokumentasi MongoDB untuk db.collections.findOneAndReplace()
untuk informasi lebih lanjut.