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

MongoDB findAndModify()

Di MongoDB db.collection.findAndModify() metode memodifikasi dan mengembalikan satu dokumen.

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

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { 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, "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. Namun, kita juga dapat melihat bahwa kolom nama dokumen telah hilang.

Itu karena, ketika Anda meneruskan dokumen ke update argumen, db.collection.findAndModify() melakukan penggantian.

Menggunakan Operator Pembaruan

Jika kami ingin memperbarui bidang, tetapi membiarkan sisa dokumen tetap utuh, kami perlu menyertakan ekspresi operator pembaruan yang relevan dalam dokumen kami.

Dengan koleksi dalam keadaan saat ini, mari kita lakukan findAndModify() lainnya operasi melawannya, tapi kali ini kita akan menggunakan $set perbarui operator untuk mengatur hanya bidang yang ingin kita ubah.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { $set: { type: "Horse" } }
})

Hasil:

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

Kali ini anjing yang tersisa telah diperbarui.

Mari kita lihat koleksinya.

db.pets.find()

Hasil:

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

Kali ini bidang yang relevan telah diperbarui, dan dokumen lainnya tetap utuh.

Kembalikan Dokumen yang Dimodifikasi

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

Jika Anda lebih suka agar dokumen yang dimodifikasi dikembalikan, gunakan new parameter.

Secara default, ini adalah new: false , yang mengakibatkan dokumen asli dikembalikan. Tetapi menentukan new: true mengakibatkan dokumen yang dimodifikasi dikembalikan sebagai gantinya.

Mari kita buat modifikasi lagi, tapi kali ini kita akan menggunakan new: true .

db.pets.findAndModify({
    query: { name: "Meow" },
    update: { $set: { name: "Scratch" } },
    new: true
})

Hasil:

{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Jadi kami mengganti nama Meow untuk Scratch dan hasilnya mencerminkan perubahan kami.

Upser

Anda dapat melakukan upsert dengan menentukan upsert: true .

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).

Contoh menggunakan upsert: false

Berikut ini contoh mencoba memperbarui dokumen yang tidak ada saat upsert: false .

db.pets.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true
})

Hasil:

null

Dokumen tidak ada dalam koleksi sehingga findAndModify() 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.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true,
    upsert: true
})

Hasil:

{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

Kali ini dokumen baru di-upser dan kita melihat dokumen yang di-upsert sebagai output (karena kita menetapkan new: true ).

Yuk cek lagi koleksinya.

db.pets.find()

Hasil:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }
{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

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

Parameter arrayFilters

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.findAndModify({
   query: { scores: { $gte: 10 } },
   update: { $set: { "scores.$[e]" : 10 } },
   arrayFilters: [ { "e": { $gte: 10 } } ]
})

Hasil:

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

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.findAndModify() metode juga menerima parameter lain, seperti writeConcern , collation , bypassDocumentValidation dan banyak lagi.

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pencarian Regex MongoDB pada Nilai Integer

  2. Mengimpor json dari file ke mongodb menggunakan mongoimport

  3. Pengantar Dasar-Dasar Zona MongoDB

  4. Spring Data MongoDB – Indeks, Anotasi, dan Konverter

  5. db.collection bukan fungsi saat menggunakan MongoClient v3.0