{Merge: true} ile set ve update arasındaki fark


115

In Bulut Firestore üç yazma işlemleri vardır:

1) ekle

2) ayarlamak

3) güncelleme

Dokümanlarda, kullanmanın set(object, {merge: true})nesneyi mevcut olanla birleştireceğini söylüyor .

Aynısı kullandığınızda da olur update(object) Öyleyse eğer varsa fark nedir? Google'ın mantığı kopyalaması garip görünüyor.

Yanıtlar:


264

Farkı anlama şeklim:

  • setolmadan mergebir belgenin üzerine yazacak veya henüz yoksa oluşturacaktır

  • setile mergebelgedeki alanları günceller veya yoksa oluşturur

  • update alanları güncelleyecek ancak belge yoksa başarısız olacak

  • create belgeyi oluşturacak, ancak belge zaten mevcutsa başarısız olacak

setVe sağladığınız verilerin türünde de bir fark var update.

Her setzaman için belge şeklinde veri sağlamanız gerekir:

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

İle updateiç içe geçmiş değerleri güncellemek için alan yollarını da kullanabilirsiniz:

update({
  'a.b.c': true
})

1
ama createAPI'de yöntemi nerede buldunuz ?
ZuzEL

2
node.js için cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… Görünüşe göre web API bu yönteme sahip değil. Hangi platformda olduğunuzdan emin
değildim

10
Bahsedebileceğiniz diğer bir ayrım , alan yolu ve değer çiftlerinin setalındığı belge şeklindeki veriler üzerinde çalışmasıdır update. Bu update, daha hantal olan derinlemesine iç içe geçmiş değerlerde değişiklikler yapabileceğiniz anlamına gelir set. Örneğin: set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true).
Gil Gilbert

Bir belgedeki bir değeri güncellemek istersem, Zaten var olan belgeleri güncellemek istemem mantıklıdır, bu yüzden set + mergeall'ın o kadar kullanışlı olmadığını düşünüyorum çünkü bu onu yaratacak çünkü belge yok
John Balvin Arias

Set komutuna sağladığınız verilerin boş olan bir alanı varsa, veritabanında zaten mevcutsa alanı boş olarak mı ayarlayacak yoksa onu yalnız mı bırakacak?
user1023110

71

"Birleştirmeyle ayarla" ve "güncelle" arasındaki diğer bir fark (Scarygami'nin yanıtını genişletir), iç içe geçmiş değerlerle çalışırken ortaya çıkar.

aşağıdaki gibi yapılandırılmış bir belgeniz varsa:

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

ve eklemek istiyorum {"friend-uid-3" : true}

bunu kullanarak:

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

şu verilerle sonuçlanacak:

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

ancak bunu updatekullanarak:

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

şu verilerle sonuçlanacak:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`

1
Bunu kendiniz test etmeyi denediniz mi? Belgelerde bir bölüm var: "Bir belgenin bazı alanlarını tüm belgenin üzerine yazmadan güncellemek için update () yöntemini kullanın
Finlay Percy

2
Bunu anladım. Bunu daha önce sadece bir dizi ile denedim. Diziye bir nesne eklemek istediğim ve bu dizi için her şeyin üzerine yazıldığı yer. Bir dizi içeren alanlarla çalışmaz ... belgelerde kalır.
ravo10

1
Testlerden sonra aynı sonuca varmıştım. Umarım { merge: true }güncelleme işlevi ile aynı etkiye sahip bir seçenek eklerler .
Johnride

1
Bu cevap için teşekkürler! Örnekler basit olsa da, benim kullanım durumum için hangisinin daha iyi olduğunu kabul edilen cevaptan daha açık hale getirdi.
naiveai

2
Kullanırken iç içe geçmiş alanlardaki verilerin (yukarıdaki yanıtta olduğu gibi) üzerine yazılmasını önlemek için update, noktalı gösterimi kullanabilirsiniz . updateNoktalı gösterimi kullanırsanız / kullanmazsanız öğesinin üzerine yazma davranışı farklıdır.
Tedskovsky

7

Dokümanlar için: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

Noktalı gösterim, diğer iç içe geçmiş alanların üzerine yazmadan tek bir iç içe geçmiş alanı güncellemenize olanak tanır. İç içe geçmiş bir alanı nokta gösterimi olmadan güncellerseniz, tüm harita alanının üzerine yazarsınız.

Yukarıda belirtildiği gibi, bu tüm arkadaş yapısının yerini alır.

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

Bu değil.

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.