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

MongoDB findOneAndUpdate()

Di MongoDB db.collection.findOneAndUpdate() metode memperbarui satu dokumen berdasarkan filter dan sort kriteria.

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.findOneAndUpdate() metode untuk memperbarui salah satu dokumen tersebut.

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Cow" } }
)

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" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Kita dapat melihat bahwa dokumen pertama sekarang berisi seekor sapi, bukan seekor anjing.

Kembalikan Dokumen yang Dimodifikasi

Secara default, dokumen asli dikembalikan saat Anda menggunakan db.collection.findOneAndUpdate() .

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.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Hasil:

{ "_id" : 2, "name" : "Bark", "type" : "Horse" }

Kali ini anjing lainnya diperbarui. Dalam hal ini, kami mengubahnya menjadi kuda, dan kami dapat melihat bahwa dokumen pengembalian mencerminkan hal ini.

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.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Hasil:

null

Dokumen tidak ada dalam koleksi dan karenanya findOneAndUpdate() mengembalikan null . Meskipun kami tidak 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, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Contoh menggunakan upsert: true

Nah ini dia lagi, tapi kali ini kita tentukan upsert: true .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        upsert: true,
        returnNewDocument: true 
    }
)

Hasil:

{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

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" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Jadi kita bisa melihat bahwa dokumen baru itu sebenarnya di-upser.

arrayFilters Parameter

Saat bekerja dengan array, Anda dapat menggunakan arrayFilters parameter bersama dengan posisi $ operator untuk menentukan elemen array mana yang akan diperbarui. Ini memungkinkan Anda memperbarui elemen larik berdasarkan nilainya, meskipun Anda tidak mengetahui posisinya.

Misalnya, kita memiliki koleksi yang disebut players dengan dokumen sebagai berikut:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Kita dapat menjalankan kueri berikut untuk memperbarui hanya elemen larik yang memiliki nilai lebih tinggi dari jumlah tertentu (dalam hal ini 10).

db.players.findOneAndUpdate(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   {
       arrayFilters: [ { "e": { $gte: 10 } } ]
    }
)

Hasil:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Ini menunjukkan dokumen sebelum diperbarui. Seperti yang diharapkan, ini hanya memperbarui satu dokumen, meskipun dua dokumen sesuai dengan kriteria.

Begini tampilan dokumennya sekarang.

db.players.find()

Hasil:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Dokumen 2 memiliki dua elemen larik yang diperbarui, karena elemen tersebut cocok dengan kriteria.

Informasi Lebih Lanjut

db.collection.findOneAndUpdate() metode juga menerima parameter lain, seperti projection (untuk menentukan subset bidang yang akan dikembalikan), sort , maxTimeMS , dan collation .

Lihat dokumentasi MongoDB untuk db.collections.findOneAndUpdate() untuk informasi lebih lanjut.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grup MongoDB berdasarkan jam

  2. Apakah buruk mengubah tipe _id di MongoDB menjadi integer?

  3. Prosedur Tersimpan MongoDB Setara

  4. Memuat sebagian gagal di server JS

  5. Mongoengine:ConnectionError:Anda belum menentukan koneksi default