Firebase update vs set (Programare, Javascript, Firebase, Firebase Realtime Database)

Bene a intrebat.

După cum spune și titlul, nu pot să înțeleg diferențele dintre update și set. De asemenea, documentația nu mă poate ajuta, deoarece exemplul de actualizare funcționează exact la fel dacă folosesc set în loc de update.

Site-ul update exemplu din documentație:

function writeNewPost(uid, username, title, body) {

    var postData = {
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    };

    var newPostKey = firebase.database().ref().child('posts').push().key;

    var updates = {};
    updates['/posts/' + newPostKey] = postData;
    updates['/user-posts/' + uid + '/' + newPostKey] = postData;

    return firebase.database().ref().update(updates);
}

Același exemplu folosind set

function writeNewPost(uid, username, title, body) {

    var postData = {
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    };

    var newPostKey = firebase.database().ref().child('posts').push().key;

    firebase.database().ref().child('/posts/' + newPostKey).set(postData);
    firebase.database().ref().child('/user-posts/' + uid + '/' + newPostKey).set(postData);
}

Deci poate că exemplul din documentație ar trebui actualizat, pentru că acum se pare că update și set face exact același lucru.

Cu stimă, Bene

1 răspunsuri
Frank van Puffelen

Atomicity

O mare diferență între cele două exemple pe care le-ai dat este în numărul de operații de scriere pe care le trimit către serverele Firebase.

În primul caz, trimiteți o singură comandă update(). Această comandă întreagă va reuși sau va eșua. De exemplu: dacă utilizatorul are permisiunea de a posta pe /user-posts/' + uid, , dar nu are permisiunea de a posta pe /posts, , întreaga operațiune va eșua.

În al doilea caz, trimiteți două comenzi separate. Cu aceleași permisiuni, comanda write to /user-posts/' + uid va reuși acum, în timp ce scrierea pe /posts va eșua.

Actualizare parțială vs. suprascriere completă

O altă diferență nu este imediat vizibilă în acest exemplu. Dar să spunem că actualizați titlul și corpul unei postări existente, în loc să scrieți o nouă postare.

Dacă ați folosi acest cod:

firebase.database().ref().child('/posts/' + newPostKey)
        .set({ title: "New title", body: "This is the new body" });

Ați înlocui întreaga postare existentă. Astfel, textul original uid, , author și starCount ar dispărea și ar rămâne doar noul câmp title și body.

Dacă, pe de altă parte, folosiți o actualizare:

firebase.database().ref().child('/posts/' + newPostKey)
        .update({ title: "New title", body: "This is the new body" });

După ce se execută acest cod, se va afișa fișierul original uid, , author și starCount vor fi încă acolo, precum și cele actualizate title și body.

Comentarii

  • Vă mulțumesc foarte mult pentru răspuns. Poate că ar fi o idee bună să actualizăm documentele cu un exemplu mai clar pentru metoda de actualizare. –  > Por Bene.
  • @frank-van-puffelen Se pare că update() este calul de bătaie goto care le poate face pe toate. Puteți chiar update proprietăți pentru a fi null… făcând efectiv aceeași treabă ca și remove. Așadar, există vreun motiv întemeiat pentru a utiliza set() deloc? Poate dacă vreți să faceți o tăiere/reamestecare serioasă a datelor? –  > Por jmk2142.
  • Documentația trebuie cu siguranță îmbunătățită pentru a adăuga informațiile din acest răspuns într-un mod clar. –  > Por Splaktar.
  • Pentru situația offline, am constatat că „set” este eficient, deoarece angajează toate modificările în baza de date firebase odată ce clientul devine online. În timp ce „update” nu a confirmat toate modificările în așteptare în baza de date firebase atunci când clientul revine în modul online. Vă rog să mă corectați dacă mă înșel. –  > Por Murtuza.
  • Da, așa este. Încercați și deschideți o nouă întrebare dacă aveți probleme în a o face să funcționeze pentru cazul dvs. –  > Por Frank van Puffelen.