Perbedaan antara set dengan {merge: true} dan update

115

Di Cloud Firestore ada tiga operasi tulis:

1) tambahkan

2) set

3) pembaruan

Di dokumen dikatakan bahwa menggunakan set(object, {merge: true})akan menggabungkan objek dengan yang sudah ada.

Hal yang sama terjadi saat Anda menggunakan. update(object) Jadi, apa bedanya jika ada? Tampaknya aneh bahwa google akan menduplikasi logika.

ZuzEL
sumber

Jawaban:

264

Cara saya memahami perbedaannya:

  • settanpa mergeakan menimpa dokumen atau membuatnya jika belum ada

  • setdengan mergeakan memperbarui bidang dalam dokumen atau membuatnya jika tidak ada

  • update akan memperbarui bidang tetapi akan gagal jika dokumen tidak ada

  • create akan membuat dokumen tetapi gagal jika dokumen tersebut sudah ada

Ada juga perbedaan dalam jenis data yang Anda berikan kepada setdan update.

Untuk setAnda selalu harus menyediakan data berbentuk dokumen:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

Dengan updateAnda juga dapat menggunakan jalur bidang untuk memperbarui nilai bertingkat:

update({
  'a.b.c': true
})
Scarygami
sumber
1
tetapi di mana Anda telah menemukan createmetode dalam API?
ZuzEL
2
cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… untuk node.js. Sepertinya API web tidak memiliki metode itu. Tidak yakin Anda menggunakan platform mana :)
Scarygami
10
Perbedaan lain yang dapat Anda sebutkan adalah yang setberoperasi pada data berbentuk dokumen, di mana updatemengambil jalur bidang dan pasangan nilai. Ini berarti Anda dapat membuat perubahan pada nilai bertingkat yang lebih dalam dengan updateyang lebih rumit set. Sebagai contoh: set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true).
Gil Gilbert
Jika saya ingin memperbarui nilai dalam dokumen, masuk akal jika saya ingin memperbarui dokumen yang sudah ada, jadi menurut saya set + mergeall tidak terlalu berguna karena akan membuatnya dokumen tidak ada
John Balvin Arias
Jika data yang Anda berikan ke perintah set memiliki bidang yang nol, apakah akan menyetel bidang ke null jika sudah ada dalam database atau akan membiarkannya sendiri?
pengguna1023110
71

Perbedaan lain (memperluas jawaban Scarygami) antara "set with merge" dan "update", adalah saat bekerja dengan nilai bertingkat.

jika Anda memiliki dokumen yang terstruktur seperti ini:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

dan ingin menambahkan {"friend-uid-3" : true}

menggunakan ini:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

akan menghasilkan data ini:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

Namun updatemenggunakan ini:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

akan menghasilkan data ini:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`
Finlay Percy
sumber
1
Sudahkah Anda mencoba menguji ini sendiri? Ada bagian dalam dokumentasi: "Untuk memperbarui beberapa bidang dokumen tanpa Timpa seluruh dokumen, menggunakan metode update () ..." Link
Finlay Percy
2
Saya menemukan jawabannya. Saya hanya mencoba ini dengan array sebelumnya. Di mana saya ingin menambahkan objek ke array, dan semuanya ditimpa untuk array itu. Itu tidak bekerja dengan bidang yang berisi larik ... itu berdiri itu docs.
ravo10
1
Baru saja sampai pada kesimpulan yang sama setelah tes. Saya berharap mereka akan menambahkan opsi yang memiliki efek yang sama { merge: true }dengan fungsi pembaruan.
Johnride
1
Terima kasih atas jawaban ini! Contoh-contohnya, meskipun sederhana, membuatnya lebih bersih daripada jawaban yang diterima mana yang lebih baik untuk kasus penggunaan saya.
naifai
2
Untuk menghindari penimpaan data di bidang bersarang (seperti dalam jawaban di atas) saat menggunakan update, Anda dapat menggunakan notasi titik . Perilaku penimpaan updateberbeda jika Anda menggunakan / tidak menggunakan notasi titik.
Tedskovsky
7

Per dokumen: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

Notasi titik memungkinkan Anda memperbarui satu bidang bertingkat tanpa menimpa bidang bertingkat lainnya. Jika Anda memperbarui bidang bersarang tanpa notasi titik, Anda akan menimpa seluruh bidang peta.

Seperti yang dinyatakan di atas, ini menggantikan seluruh struktur teman.

db.collection('users').doc('random-id').update({
    "friends": {
        "friend-uid-3": true
    }
})

Ini tidak.

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
CodeManDan
sumber