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

MongoDB findOneAndReplace()

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Luwak Tidak Dapat Terhubung Tanpa Internet

  2. cara menggunakan fungsi agregat di meteor

  3. Buat Cluster Database di Cloud Dengan MongoDB Atlas

  4. Simpan gambar di MongoDB menggunakan Node.js/Express dan Mongoose

  5. Menyiapkan koneksi tunggal dengan node.js dan mongo